種類 : hash table
難度 : easy
題目 : 202. Happy Number
思維邏輯
- 迴圈
int轉str逐一分割,再str轉int計算結果
- 檢核結果是否為1,返回
True
- 檢核是否在
set中,返回False
- 將結果加入
set
解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution: def isHappy(self, n: int) -> bool: s = set() num = 0
while True: for i in str(n): num += (int(i)**2)
if num == 1: return True if num in s: return False s.add(num) n = num num = 0
|
n的位數: d
時間複雜度: O(d) -> O(log n) -> O(1)
空間複雜度: O(1)
難點
- 迴圈何時結束: 當計算出的結果重複時
- 題目一開始沒讀懂,以為是計算結果為 0與1的組合
最佳解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| """ 集合 將計算拆成function """ class Solution: def isHappy(self, n: int) -> bool: record = set()
while True: n = self.get_sum(n) if n == 1: return True if n in record: return False else: record.add(n)
def get_sum(self,n: int) -> int: new_num = 0 while n: n, r = divmod(n, 10) new_num += r ** 2 return new_num
|
時間複雜度: O(logn)
空間複雜度: O(logn)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| """ 快慢指針 """ class Solution: def isHappy(self, n: int) -> bool: slow = n fast = n while self.get_sum(fast) != 1 and self.get_sum(self.get_sum(fast)): slow = self.get_sum(slow) fast = self.get_sum(self.get_sum(fast)) if slow == fast: return False return True def get_sum(self,n: int) -> int: new_num = 0 while n: n, r = divmod(n, 10) new_num += r ** 2 return new_num
|
時間複雜度: O(logn)
空間複雜度: O(logn)