这道leetcode题目,官方的题解,代码特别优雅。自己写的很粗糙,记录下官方的题解。题目叙述
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
首先明确一点,最大的三位数是 999,每个数字的平方和,即 92+92+92 = 243,从999变成243是变小了,四位数,五位数等等一样,会越来越小。
怎样求各数字的平方和,我没想到简单的方法,将int转成Stirng,Stirng的长度,就是int的位数,再分别取出各位的数字,算平方和。官方的实现,很优雅。
// 代码很容易理解,不过多解释
private int getSum(int n){
int sum = 0;
while(n > 0){
int temp = n%10;
sum += temp*temp;
n = n/10;
}
return sum;
}
是否无限循环,可以用快慢指针,也可以用数学的方法,即运算过程中,出现了重复的数字,一定会产生循环。
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n != 1 && !set.contains(n)){
set.add(n);
n = getSum(n);
}
return n == 1;
}
好了,题目很简单,官方给的代码很优雅,自己没想到,在这里记录下。