pythontip 100days-day16

题目

给你两个二进制字符串,返回它们的和(用二进制表示)。

例子

addBinary('11','1') -> '100'
addBinary('1010','1011') -> '10101'

假设

  1. 输入为 非空 字符串且只包含数字 1 和 0

tips

  1. 模拟加法运算
  2. 注意进位

答案

解法1:

def addBinary(a,b):
    if not a or not b: return a or b
    a, b, ans = a[::-1], b[::-1], []
    # carry: 进位
    i = j = carry = 0   
    while i < len(a) or j < len(b) or carry:
        n1 = int(a[i]) if i < len(a) else 0
        n2 = int(b[j]) if j < len(b) else 0
        carry, cur = divmod(n1 + n2 + carry, 2)
        ans.append(str(cur))
        i, j = i + 1, j + 1
    return ''.join(ans[::-1])

性能

  1. 时间复杂度O(n)
  2. 空间复杂度O(1)

关键点

  1. 模拟加法运算
  2. 注意进位

算法

  1. 遍历两个二进制字符串,从低位开始相加,相加结果的模就是该位的值,商就是进位
  2. 对每一位做运算的时候要将进位加进来,没有进位则为零

解法2:

def addBinary(bin1: str, bin2: str) -> str:
    """
    1. 判断bin1、bin2的值是否为空,如果其中一个输入为空,则直接返回另一个输入;如果两个输入都为空,则返回空
    2. 将二进制数字字符串转为数字,然后做加法运算
    3. 将运算结果通过bin()方法转为字符串,取0b后面的部分
    :param bin1:
    :param bin2:
    :return:
    """
    # 判断bin1、bin2的值是否为空,如果其中一个输入为空,则直接返回另一个输入;如果两个输入都为空,则返回空
    if not bin1 or not bin2: return bin1 or bin2
    bin1 = int(bin1, 2)
    bin2 = int(bin2, 2)

    return bin(bin1 + bin2)[2:]

性能

  1. 时间复杂度O(n)
  2. 空间复杂度O(1)

关键点

  1. 利用int(),可以将数字字符串转为数字
  2. 利用bin()方法,将数字转为二进制字符串

拓展

二进制减法

二进制乘法

二进制除法