题目
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
思路
根据题意,我们可以分析如下:
- 找到快乐数
- 没有快乐数,形成环路,造成死循环。
-
首先,我们肯定可以使用哈希表记录过程值,若找到 1,皆大欢喜。
-
如果在找的过程中,哈希表中已存在当前数,则证明进入了环路,也就是死循环了!
此时,我们就可以判断当前数不是一个快乐数了~
-
但是,为了降低空间复杂度,我们选择使用快慢指针来解决,流程如下:
5.1.创建一个慢指针,一次走一步,再创建一个快指针,一次走两步。
5.2.当快慢指针相遇,代表形参环路,该数不是快乐数。
5.3.若指针移动过程中,找到了 1,则当前数是一个快乐数。
代码
class Solution {
public boolean isHappy(int n) {// 快慢指针找到是否有环
int slow = n,fast = squereSum(n);
while (slow != fast) {
slow = squereSum(slow);
fast = squereSum(squereSum(fast));
}
return slow == 1;
}
private int squereSum(int n) {
int sum = 0;
while (n > 0) {
int temp = n % 10;
sum += temp*temp;
n /= 10;
}
return sum;
}
}