快乐数
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。
两数之和
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解法,确实和我想的差不多
标签:map,set,return,Day9,int,sum,LeetCode,刷题 From: https://www.cnblogs.com/tianmaster/p/16871759.html