代碼:
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 → 12 + 92 = 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)級別的。