编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/happy-number
解题思路
解决一个问题:如何判断是否会无限循环
可以借助之前写过的判断链表是否有环,这里将节点换成数字罢了
仍然是快慢指针,一个一次"走一格",另一个一次"走两格",如果相遇时不为1
则说明有死循环
代码
class Solution {
private int getNext(int n) {
int result = 0;
while (n != 0) {
result += Math.pow(n % 10, 2);
n /= 10;
}
return result;
}
public boolean isHappy(int n) {
int slow = n, quick = getNext(n);
while (slow != quick) { // 存在闭环则跳出
if (slow == 1 || quick == 1) {
return true;
}
slow = getNext(slow);
quick = getNext(getNext(quick));
}
return slow == 1;
}
}