2020年4月2日 星期四

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