各位平方和趋于1的数为快乐数,也就是不断算一个数的各位平方和,最后的情况可能趋于三种情况,第一种是趋于1,第二种是不断循环,第三是趋于无穷大,其实的第三种永远不会发生,因为对于3位数的数来说,下一位永远不可能大于243,4位及以上的数每次都会丢失直到3位。所以只有两种情况。所以我们要先算这个数的平方和,然后判断这个数是否已经出现过了,用hashset来记录,但这样用的空间太多了,其实这样得到的是一个隐式链表,判断有没有环就用快慢指针。
class Solution {
public boolean isHappy(int n) {
int slow=n;
int fast=getNext(slow);
while(slow!=fast && fast!=1){
slow=getNext(slow);
fast=getNext(getNext(fast));
}
if(fast==1)return true;
return false;
}
public int getNext(int n){
int res=0;
while(n!=0){
res+=(n%10)*(n%10);
n=n/10;
}
return res;
}
}