题目242. 有效的字母异位词 - 力扣(LeetCode)
class Solution {
public:bool isAnagram(string s, string t) {//把数组当成哈希表,用两个数组来存储取模后的字母对应的数量//26个字母, 模25 0~25int arrs[26];int arrt[26];for(auto &e:s){arrs[e%26]++;}for(auto &e:t){arrt[e%26]++;}for(int i=0;i<26;i++){if(arrs[i]!=arrt[i]){return false;}}return true;}
};
题目349. 两个数组的交集 - 力扣(LeetCode)
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> set1;unordered_set<int> result;//用set对结果数据去重for(auto &e:nums1){set1.insert(e);}//比较是否有相同元素for(auto &e:nums2){if(set1.find(e)!=set1.end()){result.insert(e);}}return vector<int>(result.begin(),result.end());}
};
题目202. 快乐数 - 力扣(LeetCode)
class Solution {
public:int sumCount(int n){int sum=0;while(n!=0){sum+=(n%10)*(n%10);n=n/10;}return sum;}bool isHappy(int n) {unordered_set<int> sumhappy;//计算sum,当sum不同且不为1时存入,如果计算的sum与之前计算的相同,相当于陷入死循环,返回false,如果为1就是快乐数int sum=sumCount(n);while(sumhappy.find(sum)==sumhappy.end()){//不重复循环if(sum==1){//是快乐数return true;}sumhappy.insert(sum);sum=sumCount(sum);}return false;}
};
题目1. 两数之和 - 力扣(LeetCode)
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {// 采用unordered_map不去依次遍历,而是去直接通过map寻找是否有合适的,要是没有就下一个unordered_map<int, int> map;vector<int> res;int i = 0;for (auto& e : nums) {int n = target - e;if (map.find(n) != map.end()&&map[n]!=i) {//数组中同一个元素在答案里不能重复出现。// 找到合适的了res.push_back(map[n]);res.push_back(i);return res;}map.insert(make_pair(e, i++));//注意[3,2,4] t=6 [3,3] t=6这两种情况}return res;}
};
最后
数组也是哈希的一种表现形式,在可以取模分类计数的较小数据可以用数组处理
unordered_set不是很熟悉,适合大量数据去重,快速查找
unordered_map适合kv场景下操作
有效字母的异位词适合数组充作哈希表操作
快乐数问题,需要读懂死循环条件,是重复出现的sum
两个数组的交集用unordered_set很合适,去重,快速查找
两数之和也是很适合map,不用两层for暴力查找,而是通过存入map中快速查找需要的target-n,是否存在,要是存在返回下标,不存在就继续遍历,注意这个题目的特殊情况
注意对哈希set/map所带的成员函数运用熟练 vector中没有find成员函数