LeetCode202 快乐数

链接: https://leetcode-cn.com/problems/happy-number/

题面

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:

  1. 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  2. 然后重复这个过程直到这个数变为1,也可能是无限循环,但始终变不到1。
  3. 如果可以变为1,那么这个数就是快乐数。

解法

简单的解法可以用循环,每次判断是否为1,超过一定次数后循环结束。
如果我们把每个数字想象成一个节点,就可以将问题转化为环路检测
联想到链表的解决方案—-快慢指针,判断有没有相遇,相遇的时候是否等于1即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int getNext(int n) {
int now = 0;
while(n) {
now += (n % 10) * (n % 10);
n /= 10;
}
return now;
}
bool isHappy(int n) {
int slow = n, fast = n;
do {
slow = getNext(slow);
fast = getNext(fast);
fast = getNext(fast);

} while(slow != fast);

return slow == 1;
}
};