题目:
分析:
- 第一种情况: 是快乐数: 示例1
- 第二种情况: 不是快乐数, 死循环: 示例2
- 第三种情况: 没有死循环 不存在这种情况, 因为n最大是2^31 -1 , 这个数是一个十位数, 我们假设每一位都是最大数9, 那么这个数没一位的平方和为810, 也就是说, 比9999999999小的所有数, 他们每一位的平方和都小于这个数, 所以最多计算811次, 那么一定会找到两个相同的数, 就一定存在循环
- 那么第一种情况和第二种情况, 我们可以总结成一种情况, 那就是存在环的情况, 需要用到快慢指针, (与判断链表是否存在环方法一样), 那么只需判断这个环的值是不是1, 如果是1, 则是快乐数, 如果不是1, 则不是快乐数
思路:
- 写出每一位数平方和的方法bitSum
- 定义两个变量, 一个slow = n, 一个fast = bitSum(n)
- 循环判断如果slow和fast不相等, 则slow向后移, 即slow = bitSum(slow), fast向后移两个, 即fast = bitSum(bitSum(fast)
- 相等时, 判断这个数slow或fast 是不是1
代码:
class Solution {
public int bitSum(int n){
int sum = 0;
while(n != 0){
int t = n%10;
sum += t*t;
n = n/10;
}
return sum;
}
public boolean isHappy(int n) {
int slow = n;
int fast = bitSum(n);
while(slow != fast){
slow = bitSum(slow);
fast = bitSum(bitSum(fast));
}
return slow == 1;
}
}