9.19

48. 旋转图像

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include<vector>
//原地旋转图像,不能单纯改变输出
//旋转90度可以看成是先转置,再交换列
using namespace std;


class Solution {
public:
	void rotate(vector<vector<int>>& matrix) {
		int n = matrix.size();
		//首先是对角元素相互交换
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < i; j++) {
				swap(matrix[i][j],matrix[j][i]);
			}
		}
		//然后交换列
		for (int i = 0; i < n; i++) {
			int a = 0;
			int b = matrix[i].size() - 1;
			while (a < b) {
				swap(matrix[i][a++],matrix[i][b--]);
			}
		}

	}


	void swap(int &a, int &b) {
		int tmp;
		tmp = a;
		a = b;
		b = tmp;
	}
};


int main()
{
	vector<vector<int>> matrix;
	
	Solution bb;
	int n;//表示行和列的数目
	cin >> n;
	for (int i = 0; i < n; i++) {
		vector<int> line;
		for (int j = 0; j < n; j++) {
			int tmp;
			cin >> tmp;
			line.push_back(tmp);
		}
		matrix.push_back(line);
	}
	bb.rotate(matrix);
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++) {
			cout << matrix[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}


49. 字母异位词分组

本题通过率是100/101,有一个例子超时了。


#include <iostream>
#include<vector>
#include<algorithm>
#include<string>

using namespace std;

class Solution {
public:
	vector<vector<string>> groupAnagrams(vector<string>& strs) {
		vector<vector<string>> result;
		string tmp1;//临时变量
		string tmp2;
		int i=0, j=0;
		while(i<strs.size()) {//使用while循环效果也是很好的
			vector<string> vec;
			vec.push_back(strs[i]);
			j = i + 1;
			while(j<strs.size()) {
				tmp1 = strs[i];
				tmp2 = strs[j];//这是深拷贝
				sort(tmp1.begin(),tmp1.end());
				sort(tmp2.begin(), tmp2.end());
				if (tmp1 == tmp2) {
					vec.push_back(strs[j]);
					strs.erase(strs.begin() + j);//这种使用下标的方式和使用迭代器的方式不一样
				}
				else j++;
			}
			result.push_back(vec);
			strs.erase(strs.begin()+i);
		}
		return result;
	}
};




int main()
{
	vector<string> strs;
	int n;//表示响亮里面字符的个数
	Solution bb;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string tmp;//每次都是重新生成的才对
		cin >> tmp;
		strs.push_back(tmp);
	}
	vector<vector<string>> result = bb.groupAnagrams(strs);
	for (int i = 0; i < result.size(); i++) {
		for (int j = 0; j < result[i].size(); j++) {
			cout << result[i][j] << ' ';
		}
		cout << endl;
	}
	return 0;
}




//关于指针什么的还得找时间练习,感觉又有一点生疏了!!!


据说可以使用哈希表解决这个问题————以下是别人写的代码。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>>re;
        int index = 0;  //返回结果的字母异位词索引(表示该字母异位词出现的顺序号)
        unordered_map<string, int> myMap;   //用于保存排序后的单词及其字母异位词索引      
        string str;
        for (int i = 0; i<strs.size(); ++i){
            str = strs[i];
            sort(str.begin(), str.end());
            if (myMap.find(str) == myMap.end()){
                myMap[str] = index;    //第index个出现的异位词
                ++index;
                re.push_back(vector<string>{});  //返回结果多加一行
            }
            re[myMap[str]].push_back(strs[i]);
        }
        return re;
    }
};

是按照vector{}这种方式进行初始化的吗??

猜你喜欢

转载自blog.csdn.net/the_little_fairy___/article/details/82883032