代码随想录算法训练营Day06||哈希表、Leecode242.有效字母异位词、 Leecode349. 两个数组的交集 、Leecode202. 快乐数 、Leecode1. 两数之和

一、有效字母异位词

        简单的用数组做哈希表,每个字符对应的assci码直接进行映射计数。

        

class Solution {
public:
    bool isAnagram(string s, string t) {
       int hash[1000]={0};
        for(int i=0;i<s.size();i++){
            hash[s[i]-'a']++;
        }
        for(int i=0;i<t.size();i++){
            hash[t[i]-'a']--;
        }

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

二、两个数组的交集

        这是学完C++的stl容器后第一次使用set,充分感受到他去重的方便性。但是其中的操作还不熟练,需要再做几次来熟悉,尤其是对迭代器和构造函数的使用

        本题的实现思路是,先将nums1数组放到一个unoderder_set中先做个去重的操作,然后用一个类似foreach的循环,找到nums2中存在数字的迭代器,并把它加到结果集合中,最后根据题目定义的vector类型,把set类型用迭代器重新赋值成vector返回

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
            unordered_set<int>result;
            unordered_set<int>num_set(nums1.begin(),nums1.end());
            for(int num:nums2){
                if(num_set.find(num)!=num_set.end()){
                    result.insert(num);
                }
            }

            return vector<int>(result.begin(),result.end());
    }
};

三、快乐数

        这个题说是用set,但是我不明白,为什么要用set或者说,我根本抓不到这个题的突破口在哪。我没有找到的关键点是,只要他不唯一,就会一直循环,一直循环就会出现重复值,出现重复值就可以用哈希表。

        因此,这个题要先找到,一个数的各位的平方和是多少,编写一个getsum的函数,用于计算每个数字的平方和,并且用于elem元素的更新。

        在while死循环内,设置两个结束分支,第一个,最后平方和转成1,那么return  false。否则就检查unordered_set的迭代器,看看它是否出现过,没有出现过就加一,出现过就返回0

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
            unordered_set<int>result;
            unordered_set<int>num_set(nums1.begin(),nums1.end());
            for(int num:nums2){
                if(num_set.find(num)!=num_set.end()){
                    result.insert(num);
                }
            }

            return vector<int>(result.begin(),result.end());
    }
};

四、两数之和

        本题用到了stl中另一个容器map中的unordered_map

        这个容器能够把遍历过元素和下标存放起来,查询时,用target与查询过的元素作差。

        用到的map操作需要注意的是,先用auto来定义一个自适应迭代器,来替换已经存放过的元素

并且返回值必须是一个{  },想要调用map键值对中的value值,要用->second来调用

map的插入insert({})内也要用{ }的形式插入

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int>map;
        for(int i=0;i<nums.size();i++){
            auto iter=map.find(target-nums[i]);
            if(iter!=map.end()){
                return {iter->second,i};
            }
            else{
                map.insert({nums[i],i});
            }
        
        
        
        }
        return {};
    }
};

哈希表真好玩

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值