代码:
import java.util.HashSet;
import java.util.Set;class Solution {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;}private int getNext(int n) {int sum = 0;while (n > 0) {int digit = n % 10;sum += digit * digit;n /= 10;}return sum;}
}
算法解释
-
终止条件:
-
数字变为1(是快乐数)
-
进入循环(不是快乐数)
-
-
使用HashSet检测循环:
-
记录所有出现过的数字
-
如果数字重复出现,说明进入了循环
-
-
计算下一个数字:
-
getNext
方法计算数字各位平方和 -
例如:19 → 1² + 9² = 1 + 81 = 82
-
示例
-
输入19:
复制
下载
19 → 82 → 68 → 100 → 1 → 返回true
-
输入2:
复制
下载
2 → 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 → 检测到循环,返回false
这个算法时间复杂度为O(logn),空间复杂度为O(logn),因为数字位数是log10(n)级别的。