题目242. 有效的字母异位词 - 力扣(LeetCode)
class Solution {
public:
bool isAnagram(string s, string t) {
//把数组当成哈希表,用两个数组来存储取模后的字母对应的数量
//26个字母, 模25 0~25
int 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成员函数