67.二进制求和(简单)

在这里插入图片描述
解题思路一:暴力遍历(88ms)
将a转换为a、b中最长的字符串,将a、b转换为数字列表a1、b1不用来回转换元素类型方便计算。设置i为b1的索引号(从后往前),设置j为a1的索引号(在遍历的时候使用-j以从后往前遍历)。从后往前遍历b1(短的字符串对应的列表),将a1相对应的位置赋值为a1、b1列表中对应元素的和。判断a1列表中的数值是否存在数值2,若存在2则对应位置赋值为0,前一位置加1,为了防止溢出,当第一位为2时在首位添加1。计算完成后遍历列表将列表转换为字符串。

def addBinary(a, b):
    if len(a) < len(b):
        c = a
        a = b
        b = c#把a设置为最长的字符串
    a1 = []
    b1 = []
    res = ''
    #将a,b转换为数字列表
    for aa in a:
        a1.append(int(aa))
    for bb in b:
        b1.append(int(bb))
    #定义i为b1的索引(从后往前遍历),j为a1的索引(使用-j从后往前遍历)
    i = len(b1) - 1
    j = 1
    while i > -1:#遍历b1
        print(i)
        a1[-j] = a1[-j] + b1[i]#计算列表a1中对应的数值
        for n in range(len(a1) -1, -1, -1):#遍历更新后的a1列表,实现2的进位
            if a1[n] == 2:#若a1中存在2,则把0赋值给相应位置,并且前一位加1
                a1[n] = 0
                if n == 0:#为了防止列表索引(n -1)溢出,若第一位为2,则在第0位插入1
                    a1.insert(0, 1)
                else:
                    a1[n - 1] += 1

        i = i - 1
        j = j + 1

    for aa in a1:#将结果列表转换为字符串
        res += str(aa)
    return res

解题思路二:(48ms)
使用中间变量p表示是否进位,使用s表示相加的数值。定义一个结果字符串r,p初始值为0。将字符串a、b填充为相同长度的字符串。从后往前遍历字符串,将两个字符串对应位置上的数字相加,并且加上上一结果的进位结果p,更新结果字符串r(将s%2,若s=2则字符串前面加0,否则加1),更新进位结果p(s//2,若s=2则p=1,表示需要进位,即下一位加1)。若最后p=0则说明第一位为1不需要进位,直接返回r,若p=1,则说明第一位为2,需要在字符串r前面加1。
注:结果字符串r从后往前更新,需要 str(s % 2) + r

def addBinary(a, b):
    len(b) - len(a)
    a = d * '0' + a
    b = -d * '0' + b
    for i, j in zip(a[::-1], b[::-1]):
        s = int(i) + int(j) + p
        r = str(s % 2) + r
        p = s // 2
    return '1' + r if p else r

思路三:
使用python内置函数bin()(40ms)
bin() 返回一个整数 int 或者长整数 long int 的二进制表示。其中int(a,2)中的2表示2进制(将a转换为2进制整数)bin()[2:]为二进制表示bin()直接输出为0b01011,从第2索引后面的才是二进制表示。

def addBinary(a, b):
    return bin(int(a, 2) + int(b, 2))[2:]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值