题目:
代码(首刷自解 2024年1月15日):
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> hash;
while(n != 1) {
int sum = 0;
while(n/10 != 0) {
sum += (n % 10)*(n % 10);
n/=10;
}
sum += n*n;
if (hash.find(sum) != hash.end()) return false;
else hash.insert(sum);
n = sum;
}
return true;
}
};
这个题自己十分钟做出来了,虽然是道简单题,但还是说一下做题过程:
首先,根据题意将快乐数的求解过程用代码表示出来(也就是文中不含哈希表的部分)。
然后发现一个问题,如果while循环n!=1就永远不会退出循环,于是要想办法当程序知道什么时候将永远不会等于1。
很显然,当计算过程出现一个重复的数后,就永远不会等于1,自然而然想到用哈希表记录曾经的数,如果发生重复,就退出循环,返回false。
代码(二刷自解 2024年4月23日 6min BUGFREE)
class Solution {
public:
bool isHappy(int n) {
// 哈希
unordered_set<int> visited;
// 计算一次快乐数,检测是否在hash内存在,若存在,返回false
while (n != 1) {
int sum = 0;
while (n) {
sum += pow(n % 10, 2);
n /= 10;
}
if (visited.contains(sum)) {
return false;
} else {
visited.insert(sum);
}
n = sum;
}
return true;
}
};