快乐数(HappyNumber)(LeetCode202)
1.何为快乐数?
快乐数,指的是一个数,求它的各位数的平方和,直到结果为1,即为快乐数。举个例子:
如上图所示,可以看到32在经过一系列运算后最终结果恒为1,则32为快乐数。
再比如:
如上图,以15作为起点的运算,在后续数字中出现了重复且不为1,则它会沿着这种趋势一直循环下去,所以15不是我们所期望的快乐数!
为了判断一个数字是不是快乐数,我们需要求出它的展开以便来确认结果。
在这里,我使用与快慢指针的思想,原因:如果是一个非快乐数,那么它后面的数据迟早会与前面的某一部分重复,类似于环形链表中的内环。
在这里,还是采取设置类似于两个快慢“指针”来进行数值展开,让慢指针每次只求后一位数,而快指针每次求后一个数的后一个。
此过程结束的条件有两个:
- 最后出现1,是快乐数
- 出现非1的重复数字,不是快乐数
所以,代码如下:
public class Solution {
//求下一个展开数
public static int getNext(int x){
int z = 0;
while(x>0){
z += (x%10) * (x%10);
x /= 10;
}
return z;
}
public boolean isHappy(int n) {
int low = n;
int fast = n;
do {
low = getNext(low);
fast = getNext(getNext(fast));
}while(low != fast && fast!=1);
//do-while结束条件:数值重复,即low==fast;或者fast==1,即判定为快乐数
return fast == 1;
}
}