文章目录
- 一、有效的字母异位词
- 二、两个数组的交集
- 三、快乐数
一、有效的字母异位词
242.有效的字母异位词
代码随想录知识点
哈西法可以选取的三种数据结构:
- 数组
- set
- map
class Solution
{
public:
bool isAnagram(string s, string t)
{
int hash[26] = {0};
// +1
for (int i = 0; i < s.size(); i++)
{
hash[s[i] - 'a']++;
}
// -1
for (int i = 0; i < t.size(); i++)
{
hash[t[i] - 'a']--;
}
// 判断所有的位置是不是都是0 就可以了
for (int i = 0; i < 26; i++)
{
if (hash[i] != 0)
{
return false;
}
}
return true;
}
};
二、两个数组的交集
349. 两个数组的交集
使用set,选用unordered_set,因为查询效率最高。
class Solution
{
public:
vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
{
unordered_set<int> s1;
unordered_set<int> s2;
vector<int> res;
for (auto e : nums1)
{
s1.insert(e);
}
for (auto e : nums2)
{
s2.insert(e);
}
// 把s2中的每个元素挨个去s1中查找
for (auto e : s2)
{
if (s1.find(e) != s1.end()) // 没有找到,返回end()
{
res.push_back(e);
}
}
return res;
}
};
// 更加精简的写法
class Solution
{
public:
vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
{
unordered_set<int> s1(nums1.begin(), nums1.end());
unordered_set<int> s2(nums2.begin(), nums2.end());
vector<int> res;
for (auto e : s2)
{
if (s1.find(e) != s1.end())
{
res.push_back(e);
}
}
return res;
}
};
// 使用数组来
class Solution
{
public:
vector<int> intersection(vector<int> &nums1, vector<int> &nums2)
{
int hash[1005] = {0};
unordered_set<int> res;
for (int i = 0; i < nums1.size(); i++)
{
hash[nums1[i]] = 1;
}
for (int i = 0; i < nums2.size(); i++)
{
if (hash[nums2[i]] == 1)
{
res.insert(nums2[i]);
}
}
return vector<int>(res.begin(), res.end());
}
};
三、快乐数
202.快乐数
首先先读题,会以为是数学模拟。
题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
把每次求和结果存入哈希表中,然后再查,哈希表中有没有出现1,就可以了。
class Solution
{
public:
int getSum(int n)
{
int sum = 0;
while (n)
{
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n)
{
unordered_set<int> s;
while (true)
{
int sum = getSum(n);
if (sum == 1)
return true;
if (s.find(sum) != s.end())
{
return false;
}
else
{
s.insert(sum);
}
n = sum;
}
// return true;
}
};