1. 程式人生 > >【LeetCode 簡單題】52-快樂數

【LeetCode 簡單題】52-快樂數

宣告:

今天是第52道題。編寫一個演算法來判斷一個數是不是“快樂數”。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:編寫一個演算法來判斷一個數是不是“快樂數”。

一個“快樂數”定義為:對於一個正整數,每一次將該數替換為它每個位置上的數字的平方和,然後重複這個過程直到這個數變為 1,也可能是無限迴圈但始終變不到 1。如果可以變為 1,那麼這個數就是快樂數。

示例: 

輸入: 19
輸出: true
解釋: 
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

解法1。 耗時28 ms, 在Happy Number的Python提交中擊敗了99.16% 的使用者,程式碼如下。

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if not n:
            return False
        n_record = []
        seq_sum = 0
        seq_n = n
        while seq_n != 1:
            seq_sum = 0
            while seq_n:
                seq_sum += (seq_n % 10)**2
                seq_n //= 10
            # 以下這個for迴圈和上面這個while迴圈是等效的,但是執行時間更慢,32ms
            # for i in str(seq_n):
                # seq_sum += int(i)**2
            
            if seq_sum in n_record:    # 用n_record存放出現過的中間結果,如果出現了2次就認為進入了死迴圈,直接返回False
                return False
            else:
                n_record.append(seq_sum)
            seq_n = seq_sum
        return True

解法2。用的是遞迴的做法,但是邏輯裡為什麼n==7的時候也返回True不太清楚,題幹裡沒有體現這一點,有細心的博主可以解釋一下嘛。在LeetCode上的最優做法24ms,但是這個效率比較隨機,在我的機器上執行是32ms,用的是遞迴的做法,程式碼如下。

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n < 10:
            if n == 1 or n == 7:
                return True
            else:
                return False
        new_n = 0
        while n:
            new_n += (n%10)**2
            n //= 10
        n = new_n
        return self.isHappy(new_n)    

 

結尾

解法1:https://blog.csdn.net/qq_34364995/article/details/80544503

解法2:Leetcode用時最少做法