給定兩個二進制字符串,返回他們的和(用二進制表示)。
輸入爲非空字符串且只包含數字1
和0
。
示例 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:] # 速度和上面的差不多