0
点赞
收藏
分享

微信扫一扫

LeetCode 202.快乐数


题目描述:
编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

方法:使用“快慢指针”思想找出循环:“快指针”每次走两步,“慢指针”每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为1引起的循环,是的话就是快乐数,否则不是快乐数。
为啥一定不会出现死循环,因为int类型最大值为为‭‭2 147 483 647‬‬, 所以平方和最大的数是1 999 999 999,平方和为1 + 81*9 = 724。任何数的平方和都在1到724之间,724次循环之内一定有重复的!

时间复杂度:O(logn)

class Solution {
public boolean isHappy(int n) {
int fast = n;
int slow = n;

do{
slow = isHappyNum(slow);
fast = isHappyNum(isHappyNum(fast));

}while(fast!=slow);

return slow==1;
}

public int isHappyNum(int n){
int sum = 0;
int bit = 0;
while(n>0){
bit = n%10;
sum += bit*bit;
n /= 10;
}
return sum;
}
}


举报

相关推荐

0 条评论