编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
说实话刚看到这个题目我并不是很有思路,只知道要用while循环来判断是否为快乐数,不知道到底要怎么写判定条件,所以我基本上借用了一些典型答案的思路:
我们假设一个数为快乐数,那么这个快乐数在进行了拆解平方和之后再拆解平方和再拆解平方和最后一定是等于1的,也就是有尽头的。而不能成为快乐数的逻辑也就很清晰了,我们判断他不能成为一个快乐数的方法就是一个数的拆解平方和操作最终要么是一个循环,要么每一次操作都会让数字变得更大。
那么我们是不是可以用两个指针表征每一次的拆解平方和,一个指针表征一次拆解平方和之后的数字,另一个表征两次拆解平方和之后的数字,那么如果最终给定数为快乐数,两个数最终都会归为1,于是可以有代码:
class Solution {
public:
int bitSquareSum(int n)
{
int sum = 0;
while (n > 0)
{
int bit = n % 10;
sum += bit * bit;
n = n / 10;
}
return sum;
}
bool isHappy(int n)
{
int slow = n, fast = n;
do
{
slow = bitSquareSum(slow);
fast = bitSquareSum(fast);
fast = bitSquareSum(fast);
} while (fast!=slow);
return slow==1;
}
};