代码随想录|day6|哈希表篇-- 242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数、1. 两数之和

文章介绍了四个编程问题的解决方案,包括判断两个字符串是否为字母异位词、找出两个整数数组的交集、检查一个数是否为快乐数以及找到数组中两数之和等于目标值的组合。所有问题都涉及到了哈希表或数组的使用,提供了解题思路和简洁的代码实现。
摘要由CSDN通过智能技术生成

总链接https://docs.qq.com/doc/DUEtFSGdreWRuR2p4?u=329948d2f0044f34b7cbe72503f0b572

242.有效的字母异位词

链接:代码随想录

 

class Solution {
public:
    bool isAnagram(string s, string t) {
        //两种做法,一种是int f[26]的数组,一种是map
/*第一种,麻烦
        unordered_map<int,int>my_map;
        for(auto ch:s)
        {
            my_map[ch]++;
        }
        
        for(auto ch:t)
        {
            if(my_map.find(ch)==my_map.end())
            {
                  return false;
            }
            else
            {
                my_map[ch]--;
            }
        }
        for(auto k:my_map)
        {
            if(k.second!=0)
            {
                return false;
            }
        }
        return true;
*/

//第二种,int f[26]
      int f[26]={0};
      for(auto ch:s)
      {
          f[ch-'a']++;
      }
      // s 和 t 中每个字符出现的次数都相同
      for(auto ch:t)
      {
          if(f[ch-'a']>0)
          {
            f[ch-'a']--;
          }
          else
          {
              return false;
          }
          
          
      }

      for(int i=0;i<26;i++)
      {
          if(f[i]!=0)
          {
              return false;
          }
      }
      return true;





    }
};

 349. 两个数组的交集 

链接:代码随想录

 

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //由于0 <= nums1[i], nums2[i] <= 1000,类似哈希表
       //想了构建两个set,或者两个vector,都不够简洁,看了代码随想录,这种解法是最优的
       vector<int>v(1001,0);
       for(auto num :nums1)
       {
            v[num]=1;//代表这个元素出现过 
       }

       vector<int> res;

       for(auto num :nums2)
       {
           if(v[num])
           {
               res.push_back(num);
               v[num]=0;
           }
       }
       return res;



    }
};

202. 快乐数

链接:代码随想录

建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子

 

class Solution {
public:
//int有 31位有效数字,最大值是2^31-1 ,也是最多10个9,所以不用担心每位数位数上的平方和最大值越界

//有个无限循环,怎么判断呢?-----思考,这道题之所以用哈希表,至少说明出现了重复值,即环,则利用哈希表find重复值的性质
    bool isHappy(int n) {
       unordered_set<int>my_set;
       int res=n;
       while(my_set.find(res)==my_set.end())
       {

           my_set.insert(res);
           res=caculate_sum(res);
           if(res==1)
           {
            return true; 
           }
       }
       return false;

    }

    //写一个函数,计算一个数各位数之和
    int caculate_sum(int n)
    {
        int sum=0;
        while(n>0)
        {
            int r=n%10;
            sum+=r*r;
            n=n/10;
        }
        return sum;
    }
};

1. 两数之和

链接:代码随想录

 

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        //每种输入只会对应一个答案。------找到一个答案就行
        //但是,数组中同一个元素在答案里不能重复出现。-------找到的index不能是它本身
        // 数组中元素可以重复?可以重复吗,我觉得不可以。。,因为这样就不会对应一个答案了。
        unordered_map<int,int>m;
        int index=0;
        for(auto num : nums)
        {
            if(m.find(target-num)!=m.end())//找到这个数
            {
                return {m[target-num],index};
            }
            else
            {
                m[num]=index++;
            }
        }
        return {-1,-1};

        
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值