Letcode刷題:67. 二進制求和(python)

給定兩個二進制字符串,返回他們的和(用二進制表示)。
輸入爲空字符串且只包含數字 10

示例 1:

輸入: a = “11”, b = “1”
輸出: “100”

示例 2:

輸入: a = “1010”, b = “1011”
輸出: “10101”

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-binary

我的初步解題思路就是從低位到高位,將字符轉換爲數字進行加法,保留進位。
運算之前要先把兩個字符補0成一樣長的,以便同時做運算,並且最後如果有進位,就再最後結果前面添加一位數。如下:

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        lensa=len(a)
        lensb=len(b)
        lensmax=max(lensa,lensb) # 找出最長的那個
        a='0'*(lensmax-lensa)+a  # 將兩個字符串補成等長
        b='0'*(lensmax-lensb)+b
        p=0 # 進位標誌位
        alls=''  # 最終結果的輸出
        for i in range(lensmax-1,-1,-1):
            s=int(a[i])+int(b[i])+p # 計算單位上的和
            if s==2:   # 和的結果有0 1 2 3 ,0 1 不需要進位, 2 3 都需要進1位
                p=1
                s=0
            elif s==3:
                s=1
                p=1
            else:
                p=0
            alls=str(s)+alls # 將這一位的計算結果添加上去
        if p!=0:      # 最終結束後,看最後是否進位,0則不需要進位
            alls=str(p)+alls
        return alls

執行用時 :44 ms, 在所有 python3 提交中擊敗了79.80%的用戶
內存消耗 :14 MB, 在所有 python3 提交中擊敗了5.24%的用戶
改進:
if 條件判斷是否進位可以修改爲:

 p=s//2  # 注意這兩行代碼順序
 s=s%2

因爲 0 1 的化話s不變,s=2 進位後s=0 , s=3 進位後s=1 ,所以符合變換條件
s=0,1,2,3 p=0,0,1,1 ,也符合變換條件
發現運行速度會慢一點點,內存佔用會小一點點

用python內置函數:

return bin(int(a,2)+int(b,2))[2:] # 速度和上面的差不多
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章