標籤:

【LeetCode Day 4】 258. Add Digits [easy][Python]

【LeetCode Day 4】 258. Add Digits [easy][Python]

來自專欄 望美人兮天一方

258. 各位相加 - LeetCode (中國)

給定一個非負整數 num,反覆將各個位上的數字相加,直到結果為一位數。

示例:

輸入:38

輸出:2

因為3+8=11, 11還是兩位數,然後1+1=2,2是一位數

進階:

你可以不使用循環或者遞歸,且在 O(1) 時間複雜度內解決這個問題嗎?

今天畢業拍照,後來又去看房子,回來都差點忘記打卡了!!no!我要堅持打卡咔咔咔!

但一心只想打遊戲/看綜藝的我,就摸魚的挑了一條簡單的題了

思路一:當然是循環。。

執行用時:92 ms (戰勝15.31%)

class Solution: def addDigits(self, num): """ :type num: int :rtype: int """ if len(str(num)) == 1: return num new_num = num while len(str(new_num)) > 1: new_num = sum([int(i) for i in list(str(new_num))]) return new_num

哈哈哈哈哈開心 大概是遇到最簡單的題了 兩分鐘編完 雖然是循環>。<

思路二:盡量O(1)

是我太天真。。寫不出來O(1)的演算法啊。。。然後我又去膜了一下大神代碼。。

(參考自:leetcode258-Add Digits(非負整數各位相加) - CSDN博客)

可以舉例說明一下。

假設輸入的數字是一個5位數字num,則num的各位分別為15897

15897 = 10000*1 + 1000*5 + 100*8 + 10*9 + 1*7

15897 = 1+5+8+9+7 + 9999*1 + 999*5 + 99*8 + 9*9

= 30 + 9999*1 + 999*5 + 99*8 + 9*9

再對30 做同樣的操作

15897 = 30 + 9999*1 + 999*5 + 99*8 + 9*9

= 3*10 + 0*1 + 9999*1 + 999*5 + 99*8 + 9*9

= 3 + 0 + 3*9 + 9999*1 + 999*5 + 99*8 + 9*9

= 3 + ()*9

而:15897-》1+5+8+9+7 = 30 -》 3+0=3 -》 輸出:3

所以我們可以發現,當我們做上面這一系列操作時,最後得到的右邊的餘數3其實就是我們想要的結果,所以我們可以認為把這一系列數字相加得到一個1位數的命題就等同於求num除以9的餘數。

看了賊久才看懂。。。大神!(抱拳)

兩排代碼就搞定了

然後我最開始就直接返回num%9 ,但是其實是有問題的比如18,它就不能直接用num%9....

所以當num%9=0的時候,要麼這個數字加起來為0或者為9

那我們需要考慮有沒有數字可能加起來為0呢?

考慮後,其實除了這個數字本身為0外,是不可能為0,因為沒有負數,所以只要是大於0的數相加怎麼都不可能為0

因此改一下代碼,重新run

執行用時:76 ms (戰勝87.76%)

class Solution: def addDigits(self, num): """ :type num: int :rtype: int """ if num % 9 == 0 and num != 0: return 9 else: return num % 9 ########## 或者可以這麼寫 ###################### if num < 10: return num return (num-1)%9 + 1;

哎 太trick了。。。


推薦閱讀:

010 Regular Expression Matching[H]
20. Valid Parentheses
11. Container With Most Water(medium)
020 Valid Parentheses[E]
二叉樹的LCA問題 ||LeetCode總結:Tree

TAG:Python | LeetCode |