LeetCode|哈希表|242. 有效的字母异位词 、349. 两个数组的交集 、202. 快乐数

目录

一、242. 有效的字母异位词

1.解题思路

2.代码实现

二、 349. 两个数组的交集

1.解题思路

2.代码实现

三、202. 快乐数

1.解题思路

2.代码实现


 

一、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的值
        }
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值