文巾解题 67. 二进制求和

1 题目描述

2 解题思路

2.1 整数相加过渡

将A,B转化为整数(使用迭代实现),然后将A+B转换成二进制的字符串

返回的内容从第二个下标开始,是为了剔除bin()函数返回的'0b'这两个字符串

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        A=0
        for i in a:
            A=A*2+int(i)


        B=0
        for i in b:
            B=B*2+int(i)
#分别计算A和B对应的整数

        return(bin(A+B)[2:])

2.2 整数相加过渡(使用int函数)

int(str,n):以n为基,计算字符串str的值

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        A=int(a,2)
        B=int(b,2)
        return(bin(A+B)[2:])

2.3 字符串倒置,一位一位加(同时考虑进位的问题)

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a_=a[::-1]
        b_=b[::-1]
        carry=0 #进位
        lstr='' #返回的字符串

        for i in range(min(len(a),len(b))):
            tmp=int(a_[i])+int(b_[i])+carry

            if(tmp>1):
                carry=1
                tmp=tmp-2
            else:
                carry=0
            #看是否有进位

            lstr+=str(tmp)

        if(len(a)>min(len(a),len(b))):
            for i in range(min(len(a),len(b)),len(a)):
                tmp=int(a_[i])+carry
                if(tmp>1):
                    carry=1
                    tmp=tmp-2
                else:
                    carry=0
                lstr+=str(tmp)
        #有可能一位计算完了,另一位还有值

        if(len(b)>min(len(a),len(b))):
            for i in range(min(len(a),len(b)),len(b)):
                tmp=int(b_[i])+carry
                if(tmp>1):
                    carry=1
                    tmp=tmp-2
                else:
                    carry=0
                lstr+=str(tmp)

        if(carry==1):
            lstr+=str(1)
        #全部计算完了,如果还有进位,在前面补一位

        return(lstr[::-1])

2.4 2.3方法修改版

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a=list(a)
        b=list(b)
        carry=0 #进位
        lstr='' #最终要返回的字符串

      
        while(True):
            tmp=0
            
            flag=True 
#flag表示能不能跳出这个循环,如果a,b没有值,进位为0,就能跳出

            if(len(a)>0):
                print('a',a)
                tmp+=int(a.pop())
                flag=False

            if(len(b)>0):
                print('b',b)
                tmp+=int(b.pop())
                flag=False

            if(carry>0):
                print('c',carry)
                tmp+=carry
                flag=False

            if(tmp>1):
                carry=1
                tmp-=2
            else:
                carry=0
                
            if(flag==True):
                break
        
            lstr+=str(tmp)
            
        return(lstr[::-1])

2.5 位运算

先看一下位操作的一些结论

1)异或操作(位数不同的话向前补零)

——>结果是对应两位之间不考虑进位的加法结果

2)与操作(位数不同的话向前补零)

——>只有x,y对应的元素都是1才会得到该位置为1

——>结果是x,y对应位置相加,会不会产生进位的情况

然后每一位的进位情况,影响的是前一位是否加一,所以与操作的结果要向左移动一位

然后上一次不考虑进位的相加结果+后一位的进位情况,再得到一对不考虑进位结果的+进位结果

依次迭代,直到进位情况全部为0,此时没有进位了为止

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        A=int(a,2)
        B=int(b,2)
        while(B):
            A,B=A^B,(A&B)<<1
#此时的A,B分别表示两个数(数和进位)相加的结果(不考虑进位)、进位的结果
        return bin(A)[2:]

注:在python里面 a,b=c,d 的意思是(a,b)=(c,d),也就是cd同时调整

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值