67 - 二进制求和 - python

153 阅读1分钟

给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

我实现的是一种直观但较为笨拙的方法,仅供理解~

题目要求两个字符串表示的二进制数相加后的结果,结果同样使用二进制表示。因为两个字符串不一定等长,而且我们需要从后往前依次计算相加结果。

  • 首先将其用0补齐到最长的字符串长度,然后两个表示的二进制数数组反转

  • 依次取两个数组对应位置的元素相加,使用carry记录可能的进位值,并使用index记录是否到头

    • 如果相加结果大于2且index不等于零,则将结果的当前位置设为0,并更新进位
    • 如果相加结果大于2且index等于零,除了将结果的当前位置设为0外,还需要在结果的头部插入进位1
    • 如果相加结果小于2,则将相加结果作为结果相应位置的值,继续往前计算

AC code

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        if a == '' and b == '':
            return ''
        if a == '': return b
        if b == '': return a

        a, b = list(a), list(b)
        diff = abs(len(a) - len(b))
        if len(a) > len(b):
            b = ['0'] * diff + b
        else:
            a = ['0'] * diff + a 
        a.reverse()
        b.reverse()

        carry = 0
        res = []
        index = len(a)
        for i, j in zip(a, b):
            number = int(i) + int(j) + carry
            index -= 1
            if number > 1 and index != 0:
                carry = number // 2
                res.insert(0, '{}'.format(number % 2))
            elif number > 1 and index == 0:
                res.insert(0, '{}'.format(number % 2))
                res.insert(0, '1')
            else:
                res.insert(0, '{}'.format(number))
                carry = 0

        return ''.join(res)