比较简单的哈希表,用数组记录,每个字母出现1次,就在对应的字母位数+1,最后统计两个数组是否相同即可。
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> v1(26, 0);
vector<int> v2(26, 0);
for (int i = 0; i < s.size(); i++) {
v1[s[i] - 'a']++;
}
for (int j = 0; j < t.size(); j++) {
v2[t[j] - 'a']++;
}
for (int k = 0; k < 26; k++) {
if (v1[k] != v2[k]) return false;
}
return true;
}
};
std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
这个题的注释写的很详细,重新回顾下STL迭代器的用法,很巧妙
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end()); //对nums1进行去重
for (int num : nums2) {
if (nums_set.find(num) != nums_set.end()) result_set.insert(num);
/*
find函数,返回该元素所在位置的指针,如果没有该元素,返回end
nums2中的元素依次再nums1的去重集合中查找
如果nums1中有该元素,则说明为交集,进入result集合中
*/
}
return vector<int> (result_set.begin(), result_set.end());
}
};
这题我是真不快乐啊,想到了用上一道题unordered_set来记录每次进入的数据,一旦查到该数据在set中已经存在,则代表已经进入无限循环,即该数不是“快乐数”。
题目的另一个难点是如何把这个数进行变化(感觉这是难点),通过取余和除10来进行操作。
class Solution {
public:
// 本题关键,如何将各个位平方并加和
int getSum(int n) {
int sum = 0;
while (n) {
sum += (n % 10) * (n % 10);
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> result;
while (1) {
int sum = getSum(n);
if (sum == 1) return true;
else {
if (result.find(sum) != result.end()){
return false;
}
else result.insert(sum);
}
n = sum;
}
}
};
使用unordered_map,键值对分别为数组元素和对应下标
插入数据时,在map中寻找与之求和为目标数的数组元素,如果找到,返回两个数的下标,如果没有,将刚插入的数据与其元素下标加入map中。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
哈希表的题目都很巧妙,关于STL map和set的用处掌握的还是不够熟练
加深对find函数的使用理解