目录
  1. 1. 思路
快乐数

编写一个算法来判断一个数是不是“快乐数”。

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

  • 例如:19

1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

思路

使用“快慢指针”思想找出循环:“快指针”每次走两步,“慢指针”每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为1引起的循环,是的话就是快乐数,否则不是快乐数。

  • 注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是int型而投机取巧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public boolean isHappy(int n) {
int p1 = n, p2 = n;

do{
p1 = bitSquareSum(p1);
p2 = bitSquareSum(bitSquareSum(p2));
}while(p1 != p2);

//如果循环点是1,则它是快乐数
//也有可能循环点不是1
return p1 == 1;
}

public int bitSquareSum(int n){
int sum = 0 ,bit = 0;
while(n != 0){
bit = n%10;
sum += bit*bit;
n /= 10;
}
return sum;
}
文章作者: EasonZzZz
文章链接: http://yoursite.com/2019/10/27/算法之旅/LeetCode/快乐数/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Nice To Meet U