每日題。八點起床寫扣的感覺真好。題目的deci-binary還真難想到對應的中文翻譯,就算只看英文其實也是滿模糊的。

題目

如果一個十進位數字沒有前導零,且只有出現數字0和1,那該數字稱為十又二進位數字,例如101和110;而112和3001則不是。
輸入字串n,代表一個十進位正整數,求最少需要多少個十又二進位數字才能使總和達到n。

解法

其實只看描述還真不太確定題目想表達什麼,好在有例題1有詳細解釋:

32 = 10 + 11 + 11

反正就是把一個整數拆成好幾個只包含1和0的整數,且越少越好。
但每一個整數最多只能對某個位數增加1,所以需要的數量取決於所有位數中的最大值。

class Solution:
    def minPartitions(self, n: str) -> int:
        ans=1
        for c in n:
            ans=max(ans,int(c))
            
        return ans

仔細想想,答案只取決於每個位數中的最大值,那麼可以從9開始往下找,若某個值有出現過,則直接回傳。
執行起來有夠快,才42ms,勝過99.24%的提交。

class Solution:
    def minPartitions(self, n: str) -> int:
        for c in '987654321':
            if c in n:return c

最後是搞笑python解法。
字串本身是iterable,丟給max函數會把字串拆成好幾個字元,並回傳其中最大者。
leetcode本身不管回傳值型別,只要答案轉回字串後相同就算正確。

class Solution:
    def minPartitions(self, n: str) -> int:
        return max(n)