哈希part I

字符串字符完成hash 整数数组用set完成hash

有效的字母异位词

242.有效的字母异位词

法1: 创建2个vector 并比较

		bool isAnagram(string s, string t) {
        if(s.length() != t.length()) return false;
        vector<int> sv(26,0);
        vector<int> tv(26,0);
        //s 和 t 仅包含小写字母
        for (int i = 0; i < s.length(); ++i) {
            sv[s[i] - 'a']++;
            tv[t[i] - 'a']++;
        }
        //比较两个vector中元素
        int i;
        for (i = 0; i < 26; ++i) {
            if (sv[i]!=tv[i]){
                return false;
            }
        }
        //条件
        return true;

    }

两个数组的交集

349. 两个数组的交集
法1: 创建2个set存放数组的值 在长的set中查找短set中的元素 找到则放入vector

    vector<int> ans;
    set<int> s1;
    for (int i = 0; i < nums1.size(); ++i) {
        s1.insert(nums1[i]);
    }
    set<int> s2;
    for (int i = 0; i < nums2.size(); ++i) {
        s2.insert(nums2[i]);
    }

    int minLen=min(s1.size(),s2.size());
    if (minLen==s1.size()){
        //迭代器取值
        set<int>::iterator it;
        for(it = s1.begin();it != s1.end();it++) {
            if ((s2.find(*it)!=s2.end())){
                cout << *it << endl;
                ans.push_back(*it);
            }
        }
    } else{
        //迭代器取值
        set<int>::iterator it;
        for(it = s2.begin();it != s2.end();it++) {
            if ((s1.find(*it) !=s1.end())){
                ans.push_back(*it);
            }
        }
    }
    return ans;

法2:创建2个set set01存放vector01元素 在set01中查找vector02元素 存在则放入ansSet

        //set使用不熟练
        set<int> s1(nums1.begin(), nums1.end());
        set<int> ansSet;
        for (int i = 0; i < nums2.size(); ++i) {
            if(s1.find(nums2[i]) != s1.end()){
                ansSet.insert(nums2[i]);
            }
        }
        return vector<int>(ansSet.begin(),ansSet.end());

快乐数

202. 快乐数

法1: 常规思路 数值裂解 求平方和 放入set 平方和在set中已经存在->no_happy 反之 happy

    class Solution {
public:
    //获取数位上的数值 返回值按从低位到高位
    vector<int> splitNum(int i){
        vector<int> num;
        while (i)
        {
            int u = i % 10;
            num.push_back(u);
            i = i / 10;
        }
        return num;
//        reverse(num.begin(), num.end());
    }
    bool isHappy(int n) {
        //if happy else no_happy
        //要么可以转到1要么无限循环
        set<int> storeNum;
        //进行循环 条件
        int flag = n;
        while (flag != 1) {
            //存入set
            storeNum.insert(flag);
            //各位置上的数值
            vector<int> number;
            number = splitNum(flag);

            //经过运算出现的数值 (不确定set中是否存在)
            int newN = 0;
            for (int i = 0; i < number.size(); ++i) {
                newN += number[i] * number[i];

            }
            if ((storeNum.find(newN)) != storeNum.end()) {
                return false;
            }
            flag = newN;
        }
        return true;
    }
};

上面是自己写的代码 将求平方和逻辑混在其中,容易死循环
借鉴代码随想录思路,将求平方和逻辑分离出去

    int getSum(int n){
        int sum = 0;
        while (n)
        {
            int u = n % 10;
            sum += u * u;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {

        //求平方和逻辑也分离出去 只有n sum 和set在改变
        set<int> storeNum;
        while(1){
            if (n == 1)
                return true;
            int sum = getSum(n);
            if (storeNum.find(sum) != storeNum.end()){
                return false;
            }else{
                storeNum.insert(sum);
            }
            n = sum;
        }
    }

两数之和

1. 两数之和

法1:
思路 map<number,position> 遍历 判断条件:map内存在target - nums[i] 否则向map填充数据


    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ans;
        //hash
//        multiset<int>storeNum();
        //不存在重复数值
//        set<int> storeNumber;
        map<int,int> storeNumber;
        for (int i = 0; i < nums.size(); ++i) {
            if (storeNumber.find(target-nums[i]) != storeNumber.end()){
                ans.push_back(storeNumber[target-nums[i]]);
                ans.push_back(i);
            }
            storeNumber.insert(make_pair(nums[i],i));
        }
        return ans;
    }

上述是参考之前的java hashMap改写过来的,有好的思路再完善。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值