
解题思路
方法一:
要么到 1,要么无限循环(重复出现某个数)。
所以我们只需要:
每次计算平方和 → 看是否重复 → 重复 = 不是快乐数
c++代码:
cpp
class Solution {
public:
int getnum(int n) {//计算平方和
int sum = 0;
while (n > 0) {
int num = n % 10;//去最后一个数字
sum += num * num;//平方累加
n /= 10;//去掉最后一位
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> s;// 记录出现过的数字
while (true) {
int sum = getnum(n);
if (sum == 1)//如果为1,是快乐数
return true;
if (s.count(sum))//如果出现重复的就不是快乐数
return false;
s.insert(sum);
n = sum;
}
}
};
方法二:
不是快乐数 → 一定会进入循环
快慢指针:快指针走两步,慢指针走一步
如果相遇 == 有环(不是快乐数)
如果快指针走到 1 == 快乐数

我们通过计算发现这是循环的,而且这个可以抽象成链表是否有环来解题
这就可以用快慢指针的方法解题
慢指针走一步,快指针走两步
c++代码:
cpp
class Solution {
public:
int getnum(int n) {
int sum = 0;
while (n > 0) {
int num = n % 10;
sum += num * num;
n /= 10;
}
return sum;
}
bool isHappy(int n) {
int slow = n;// 慢指针:初始在起点,每次走1次平方和
int fast = getnum(n);// 快指针:先走一步,每次走2次平方和
while (fast != 1 && slow != fast) {
slow = getnum(slow); // 走一步
fast = getnum(getnum(fast)); // 走两步
}
return fast == 1;
}
};