目录
一、242. 有效的字母异位词
1.解题思路
判断两个字符串中,所包含的字符出现的次数是否都相同,可以用哈希表来求解。本题中,所给的两个字符串都是由小写字母组成(abcd....wxyz),只有26个且连续,所以可以采用数组这一哈希结构来求解。
方法:定义一个数组record,长度为26,每个元素初始化为0。下标0的位置记录字符‘a’出现的次数,下标1的位置记录字符‘b’出现的次数,其他字符同理。先遍历第一个字符串s,遍历结束后,每个字符出现了多少次数组record都记录完毕。接下来遍历另外一个字符串t,在这里不需要额外定义一个数组,只需在原数组record的基础上,对t中出现的字符在对应下标上做“--”操作即可。最后,如果record数组中的元素都为0,那么说明两个字符串为有效的字母异位词。
2.代码实现
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']++;
}
//遍历第二个字符串,将record中元素对应--
for(int i = 0;i < t.size();i++){
record[t[i] - 'a']--;
}
//开始判断record数组中是否全为0,出现非零元素,则代表两个字符串字符出现次数不一样
for(int i = 0;i< 26;i++){
if(record[i] != 0){
return false;
}
}
//遍历结束都没发现非零元素
return true;
}
};
二、 349. 两个数组的交集
1.解题思路
题目要求输出的结果每个元素是唯一的,也就是要我们做去重操作,所以选对正确的哈希表结构是非常关键的。本题使用unordered_set哈希结构来求解,unordered_set可以自动帮忙做去重的操作(往里面添加100个元素1,最后也只有一个1)。
2.代码实现
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;//存放结果,unordered_set自动去重
unordered_set<int> nums_set(nums1.begin(),nums1.end());//将nums1数组中的元素存放到unorder_set中
for(int num : nums2){
//如果nums2里面的元素在nums里面出现过
if(nums_set.find(num) != nums_set.end()){
result_set.insert(num);//就将他插入到result_set中
}
}
return vector<int>(result_set.begin(),result_set.end());
}
};
三、202. 快乐数
1.解题思路
核心:将每次计算得到的“各个位置上的数字的平方和sum”保存到unordered_set中,如果sum重复出现,说明进入了无限循环,否则一直计算直到sum == 1。
2.代码实现
class Solution {
public:
int getSum(int n){//计算n每个位置上数字的平方和
int sum = 0;
while(n){
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> record_set;//用来存放每次sum的值
while(1){
int sum = getSum(n);//调用函数,计算平方和的值
if(sum == 1){//如果平方和变成了1,说明是题目要求的数,直接返回true
return true;
}
if(record_set.find(sum) != record_set.end()){//如果set表里面已经出现过这个sum,说明进入了无限循环
return false;
}
else{//还没有出现过这个sum,就插入到unordered_set表中
record_set.insert(sum);
}
n = sum;//更新n的值
}
}
};