242.有效的字母异位词
题目链接
题解:简单哈希题目,只需要注意26个英文字母作为哈希映射值的时候不需要用具体ASCII码,只需要相对的数值就可以了,因此哈希数组大小就是26,有效减少内存占用。
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26]={0};
for(int i=0;i<s.size();i++){
record[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
record[t[i]-'a']--;
}
for(int i=0;i<26;i++){
if(record[i]!=0) return false;
}
return true;
}
};
349. 两个数组的交集
题目链接
题解:首先使用哈哈希数组来记录 一个数组的数字出现次数,然后遍历,如果值大于0说明重复,那么把这个元素放进结果集里。需要注意的是,这里结果集可以不用题目中要求返回的vector,因为vector无法去重,去重有点繁琐,所以干脆使用std里面的unordered_set,即无序集合(题目没有要求有序,如果要求有序则使用set。此处注意set,vector它们常用的操作函数。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int record[10001]={0};
unordered_set<int> result;
for(int i=0;i<nums1.size();i++){
record[nums1[i]]++;
}
for(int i=0;i<nums2.size();i++){
if(record[nums2[i]]!=0){
result.insert(nums2[i]);
}
}
return vector<int> (result.begin(),result.end());
}
};
202. 快乐数
题目链接
题解:求和的过程中,sum会重复出现,所以这意味着一旦sum重复出现了就可以返回false了,因为不可能是快乐树,因此需要一个unordered_set记录sum。然后不断重复地对n的每个位数求平方和,直到sum变成1,否则过程中如果出现了重复的sum那么直接跳出循环返回false。
class Solution {
public:
bool isHappy(int n) {
bool flag = true;
unordered_set<int> hash;
while (n != 1) {
long int res = 0;
int t = n;
while (t != 0) {
res = res + (t % 10) * (t % 10);
t=t/10;
}
if (hash.count(res) > 0) {
flag = false;
break;
} else {
hash.insert(res);
}
n = res;
}
return flag;
}
};
纯链表和纯哈希题目都比较简单,不能多花时间了,速通之后去看算法了。