快乐数
- .
- 习题链接
- 题目
- 题目解析
- 初始值
- 算法原理
- 我的答案
.
习题链接
快乐数
题目
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
题目解析
分析题目,可以得到两种结果:
- 一直在1这个数上死循环,如:1->1->1…
- 在历史的数据中进行死循环,但始终不为1
由上面两种结果可以推断出:结果必定会出现死循环,我们只需要找到死循环后进入循环圈中的一个数,判断这个数是否为1,就可以判断出该正整数是否为快乐数.
那么问题很明确,我们现在需要做的是,找到那个进入循环圈的数,这里我们使用双指针中的快慢指针来完成
初始值
fast: bitSum(n)
slow: n
因为后面进行while循环的时候,判断条件是fast!=slow,因此需要让fast与slow的初始值错开一位
算法原理
fast这个指针每次进行两次求平方和,而slow则是进行一次求平方和,循环执行该步骤,直到fast与slow相等,则说明已经找到了一个在循环圈里的数
我的答案
class Solution {
public boolean isHappy(int n) {
int fast = bitSum(n);
int slow = n;
while(fast!=slow){
fast=bitSum(bitSum(fast));
slow=bitSum(slow);
}
return fast==1;
}
public int bitSum(int n){
int sum = 0;
while(n!=0){
int tmp = n%10;
sum = sum +tmp*tmp;
n=n/10;
}
return sum;
}
}