快乐数(HappyNumber)

快乐数(HappyNumber)(LeetCode202)

1.何为快乐数?

快乐数,指的是一个数,求它的各位数的平方和,直到结果为1,即为快乐数。举个例子:
快乐数(HappyNumber)如上图所示,可以看到32在经过一系列运算后最终结果恒为1,则32为快乐数。
再比如:
快乐数(HappyNumber)如上图,以15作为起点的运算,在后续数字中出现了重复且不为1,则它会沿着这种趋势一直循环下去,所以15不是我们所期望的快乐数!
为了判断一个数字是不是快乐数,我们需要求出它的展开以便来确认结果。

在这里,我使用与快慢指针的思想,原因:如果是一个非快乐数,那么它后面的数据迟早会与前面的某一部分重复,类似于环形链表中的内环。

在这里,还是采取设置类似于两个快慢“指针”来进行数值展开,让慢指针每次只求后一位数,而快指针每次求后一个数的后一个。

此过程结束的条件有两个:

  1. 最后出现1,是快乐数
  2. 出现非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;
    }
}
上一篇:hhhhh我又双叒进步啦!


下一篇:日记