LeetCode刷题记录.Day9

快乐数

题目链接202. 快乐数 - 力扣(LeetCode)

class Solution {
public:
    int getSum(int n){
        int sum = 0;
        while(n){
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> set;
        while(1){
            int sum = getSum(n);
            if (sum == 1){
                return true;
            }
            if(set.find(sum) != set.end()){
                return false;
            }
            else{
                set.insert(sum);
            }
            n = sum;
        }
    }
};

整体不算难。抽象出问题后发现只存在两种情况,第一种,经过运算后结果唯一。第二种,经过运算后无限循环

然后无限循环的时候必定会存在两次运算的结果相等的情况,所以可以用哈希表方法,记录下每次运算结果,快速查找每次运算结果是否和上一次重复,如果重复,必定为false。

两数之和

题目链接1. 两数之和 - 力扣(LeetCode)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
        for(int i = 0; i< nums.size(); i++){
            auto j = map.find(target - nums[i]); //查找是否已经存在符合目标值的数
            if(j != map.end()){
                return {j->second, i}; //作为索引key的j实际上是数组值,而j对应的value是数组下标
            }else{
                map.insert(pair<int, int>(nums[i],i)); //数组值做索引key,下标做值value
            }
        }
        return {};
    }
};

以前写python的时候用字典干过类似思路的事情。就是把一个按照值的某种规则重新排列,大概思想很类似,也是建立一个字典用值做索引,下标做值来进行查找操作。算是比较好理解这道题的思路,顺便看了一下卡哥给出的python解法,确实和我想的差不多

posted @ 2022-11-08 23:57  凱風快晴  阅读(26)  评论(0)    收藏  举报