题目
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
答案
class Solution {
private int getNext(int n){
int totalSum = 0 , d=0;
while(n>0){
d = n%10;
n=n/10;
totalSum += d*d;
}
return totalSum;
}
public boolean isHappy(int n) {
Set<Integer> seen = new HashSet<>();
while(n!=1 && !seen.contains(n)){
seen.add(n);
n = getNext(n);
}
return n==1;
}
}
解析
本题使用哈希集合检测循环,在本题中,数字的变化只有两种,一种是变为1,另一种是循环,没有无限大的可能,因为999的快乐数为243,别的数快乐数一般不会超过243,如果超过后会逐渐变小。
本题分两步,第一步计算这个数的快乐值,第二步判断快乐数是否进入循环,如果没进入,并且值不唯一,就将快乐数放入哈希数组中,继续计算快乐数,知道出现结果。