题目描述
【leetcode】202. 快乐数( Happy Number )
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
第一次解答
思路:
本题最大的一个问题就是:是否存在无限重复但不循环的情况?
要回答这个问题,直观上我们可以这么想:本题是通过将每一个数字平方求和得到新的数,由于都是个位数的平方,
每个平方项最大值仅为9^2=81,也就是说每增加一位数字,才能增加最多81的增量,当n为3位数后,例如n=100,
要增加一位数,使得n=1000,则n需要增量900(约等于10^3),而增加这位数字后,按照快乐数的流程,仅仅为下个数增加81的增量,
这就抑制了下一次数的大小,所以我们可以"感觉"得到n不会得到特别大的数(甚至我猜n不会大于3位数),所以n的范围因该是[0,B],
B是一个确定的上届,n应该不会超过这个B,又因为n为整数,所以n为有限个值。
而又因为n为有限个值,所以我们可以得出结论:不会存在无限重复但不循环的情况。
有了上述结论,我们就可以放心的根据“是否n为1”或“是否循环”来决定n是否是快乐数了。
这里用快慢指针
test case:
1
19
代码:
class Solution {
public:
int next_n(int n){
int sum = 0;
while(n > 0){
int temp = n % 10;
sum += temp*temp;
n /= 10;
}
return sum;
}
bool isHappy(int n) {
int n_slow = n;
int n_fast = next_n(n);
while(true){
if(1 == n_fast)
return true;
if(n_slow == n_fast)
return false;
n_slow = next_n(n_slow);
n_fast = next_n(next_n(n_fast));
}
}
};
结果: