一、【寫在前面】
這道題需要,給你兩個字符串比如
a = "1010", b = "1011"
答案是:"10101"
然后需要你給出計算結(jié)果,那么我們很容易想到兩種做法
1. 調(diào)庫做法:直接轉(zhuǎn)化為整數(shù),然后用內(nèi)置函數(shù)做進制轉(zhuǎn)換直接計算出結(jié)果
2. 計算做法:將十進制思維移植過來,對每一位加并且做carry操作,最后得出結(jié)果
筆者最初是這么做的,不過這樣出來的時間和空間復雜度比較差勁,看到了一種非常巧妙的方法,這里分享給大家。
二、【代碼給出】
我把注釋寫的全一點,這樣:這個算法的本質(zhì)就是不斷重復無進位加,直到carryflag沒有信息為止。
舉個例子,這個例子最后計算出來是1100011
101011 + 111000
首先做無進位加(與),得到:ans = '0b10011' ;carry = 010011 << 1 = '0b1010000'
ans和carry繼續(xù)做無進位加,得到:ans = '0b1000011' ; carry =?10000 << 1 = '0b100000'文章來源:http://www.zghlxwxcb.cn/news/detail-795266.html
繼續(xù)重復 ans =?'0b1100011';carry = 0 << 1 = '0b0'文章來源地址http://www.zghlxwxcb.cn/news/detail-795266.html
class Solution:
def addBinary(self, a: str, b: str) -> str:
# carry_flags = 0b0000 # carry_flag 形如xxflag的這種形式會在接觸到底層時大量看見
a , b =int(a,2),int(b,2) # 先做進制轉(zhuǎn)換,轉(zhuǎn)到二進制
# 預計算一下ans和carry
# 為什么要用異或,因為異或可以視為沒有進位的加法
# 然后把進位信息存到carryflag中,直接做“與”,同1為1,然后左移一位,剛好可以作為進位,是不是很巧妙
ans , carry_flags = a^b , (a&b) << 1
while carry_flags: # 然后就是不斷重復carry和ans的無進位加,直到?jīng)]有進位信息,加法就完成了
temp_ans = ans ^ carry_flags
carry_flags = (ans&carry_flags) << 1
ans = temp_ans
return bin(ans)[2::] # 直接返回會有0b1111,可以類比0xfff,所以需要切掉前面兩個字符
到了這里,關(guān)于力扣67. 二進制求和算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!