Leetcode題解 Python: 四月挑戰DAY2 Happy Number

給一個整數,按照十進位分切出各單個數字,這些數字的平方加總後,繼續分切…,如果最後總合等於 1,就是快樂數字。

好吧,到底哪裡快樂我也不知道。這依舊是一個非常簡單的題目。

可以分成三個步驟:
1.分切數字
2.數字平方和
3.判斷為1,否則回到步驟1.

要是碰到無限循環怎麼辦?把出現的數字記錄下來,只要有數字重複出現那就是無限循環。

用一個 memo ,字典或是集合(set),之後用 in 就能看出是否有重複出現過。

還有更偷機的做法,就是把False的數字回收進memo。這樣會相當Happy。

class Solution:
def isHappy(self, n: int) -> bool:
memo = {2: False, 3: False, 4: False, 5: False, 6: False, 8: False, 9: False,
11: False, 12: False, 14: False, 15: False, 16: False, 17: False, 18: False,
20: False, 21: False, 22: False, 24: False, 25: False, 26: False, 27: False,
29: False, 30: False, 33: False, 34: False, 35: False, 36: False, 37: False,
38: False, 39: False, 40: False, 41: False, 42: False, 43: False, 45: False,
46: False, 47: False, 48: False, 50: False, 51: False, 52: False, 53: False,
54: False, 55: False, 56: False, 57: False, 58: False, 59: False, 60: False,
61: False, 62: False, 63: False, 64: False, 65: False, 66: False, 67: False,
69: False, 71: False, 72: False, 73: False, 74: False, 75: False, 76: False,
77: False, 78: False, 80: False, 81: False, 83: False, 84: False, 85: False,
87: False, 88: False, 89: False, 90: False, 92: False, 93: False, 95: False,
96: False, 98: False, 99: False, 106: False, 113: False, 117: False, 128: False,
145: False, 162: False}
if n in memo: return False
num2 = 0
while n>1:
if n in memo: return False
else: memo[n]=None
while n>0:
num2 += (n % 10)**2
n = n//10
n, num2 = num2, 0
return True

如果用字典是比較容易去偷機,如果不偷機,用集合會比較好增加資料(可以少打幾個字)。

class Solution:
def isHappy(self, n: int) -> bool:
memo = {*''}
num2 = 0
while n>1:
if n in memo: return False
else: memo.add(n)
while n>0:
num2 += (n % 10)**2
n = n//10
n, num2 = num2, 0
return True