【题目描述】
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
【示例】
【代码】官方
正如我在【admin】里面说的一样, n的各位数进行平方后可能进入一个循环, 所以我们需要一个set保留中间结果。
package com.company;
// 2023-1-8
import java.util.HashSet;
import java.util.Set;
class Solution {
private int getNext(int n) {
int total = 0;
while (n > 0){
int d = n % 10;
n = n / 10;
total += d * d;
}
return total;
}
public boolean isHappy(int n) {
Set<Integer> seen = new HashSet<>();
while (n != 1 && !seen.contains(n)){
seen.add(n);
n = getNext(n);
}
return n == 1;
}
}
public class Test {
public static void main(String[] args) {
new Solution().isHappy(19); // 输出: true
new Solution().isHappy(7); // 输出: true
new Solution().isHappy(2); // 输出: false
new Solution().isHappy(1111111); // 输出: true
}
}
【代码】admin
通过率: 403/402 卡在了"1111"上, 因为这个叠加出来后的值是7, double后又回到大于10的场景了
不研究了, 研究一下大神的模板
package com.company;
// 2023-1-7
class Solution {
public boolean isHappy(int n) {
if (n < 1 ) return false;
// 这里有些数, double后悔进入到
while (n >= 2 && n <= 9){
int tmp = 0;
tmp += Math.pow(n % 10, 2);
n = tmp;
}
while ( n >=10 ){
int tmp = 0;
while (n > 0){
tmp += Math.pow(n % 10, 2);
n = n / 10;
}
n = tmp;
}
return n == 1;
}
}
public class Test {
public static void main(String[] args) {
new Solution().isHappy(19); // 输出: true
new Solution().isHappy(7); // 输出: true
new Solution().isHappy(2); // 输出: false
new Solution().isHappy(1111111); // 输出: true
}
}