> 文章列表 > 力扣 202. 快乐数

力扣 202. 快乐数

力扣 202. 快乐数

题目来源:https://leetcode.cn/problems/happy-number/description/

C++题解当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

使用unordered_set存放平方和的值,如果平方和为1,则返回true,如果平方和已经存在unordered_set中,说明已经进入循环,不存在平方和,则返回false。

需注意unordered_set的find()函数,如果找到指定元素,它返回元素的迭代器,如果找不到指定元素,则返回指向unordered_set::end()的迭代器。所以并不能将其赋值,不能用true或者false来判断是否找到元素,要用end()函数。

class Solution {
public:bool isHappy(int n) {bool flg = false;unordered_set<int> res;string a;int len = 0;while(1) {a = to_string(n);len = a.size();n = 0;for(int ii = 0; ii < len; ii++) {n = n + int(a[ii]-'0') * int(a[ii]-'0');}if(n == 1) return true;else if(res.find(n) != res.end()) break;else res.insert(n);}return flg;}
};

其他题解:跟我们的思路一致,但是我们求sum是转换成字符,网上的用了取余数。

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;}// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return falseif (set.find(sum) != set.end()) {return false;} else {set.insert(sum);}n = sum;}}
};