【LeetCode 簡單題】52-快樂數
阿新 • • 發佈:2018-11-04
宣告:
今天是第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用時最少做法