二进制之和 | 豆包MarsCode AI刷题

41 阅读4分钟

题目内容

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

题目分析

题目理解

题目要求我们将两个二进制字符串相加,并以十进制的形式返回结果。二进制字符串可能非常长,因此需要考虑大数处理的问题。我们需要设计一个算法,确保时间复杂度不超过 O(n^2)

解题思路

  1. 补齐二进制字符串

    • 由于两个二进制字符串的长度可能不同,我们需要先将它们补齐到相同的长度。可以通过在较短的字符串前面补零来实现。
  2. 逐位相加

    • 从最低位(最右边的位)开始,逐位相加两个二进制字符串的对应位。
    • 每次相加时,需要考虑上一位的进位。
  3. 处理进位

    • 每次相加后,计算当前位的和以及进位。
    • 如果当前位的和大于等于2,则产生进位。
  4. 生成结果

    • 将逐位相加的结果存储在一个列表中,最后反转列表得到正确的二进制结果。
    • 将二进制结果转换为十进制。

数据结构选择

  • 列表:用于存储逐位相加的结果。
  • 整数:用于存储进位。

算法步骤

  1. 补齐二进制字符串

    • 计算两个二进制字符串的最大长度。
    • 使用 zfill 方法将较短的字符串补齐到最大长度。
  2. 逐位相加

    • 从最低位开始,逐位相加两个二进制字符串的对应位。
    • 计算当前位的和以及进位。
    • 将当前位的结果添加到结果列表中。
  3. 处理最高位进位

    • 如果最高位有进位,将其添加到结果列表中。
  4. 生成最终结果

    • 反转结果列表。
    • 将二进制结果转换为十进制。

例子

例子1:

  • 输入:binary1 = "101" ,binary2 = "110"
  • 补齐后:binary1 = "101" ,binary2 = "110"
  • 逐位相加:
    • 最低位:1 + 0 + 0 = 1,进位 0,结果 1
    • 中间位:0 + 1 + 0 = 1,进位 0,结果 11
    • 最高位:1 + 1 + 0 = 2,进位 1,结果 111
  • 最终二进制结果:111
  • 转换为十进制:7
  • 输出:'7'

例子2:

  • 输入:binary1 = "111111" ,binary2 = "10100"

  • 补齐后:binary1 = "111111" ,binary2 = "010100"

  • 逐位相加:

    • 最低位:1 + 0 + 0 = 1,进位 0,结果 1
    • 次低位:1 + 0 + 0 = 1,进位 0,结果 11
    • 中间位:1 + 1 + 0 = 2,进位 1,- - 结果 111
    • 次高位:1 + 0 + 1 = 2,进位 1,结果 1111
    • 最高位:1 + 1 + 1 = 3,进位 1,结果 11111
  • 最终二进制结果:1010111

  • 转换为十进制:87

  • 输出:'87'

参考代码

def solution(binary1, binary2):
    # 先将两个二进制字符串补齐到相同长度
    max_length = max(len(binary1), len(binary2))
    binary1 = binary1.zfill(max_length)
    binary2 = binary2.zfill(max_length)
    # 用于存储进位
    carry = 0  
    # 结果列表
    result = []  
    # 从最低位开始逐位相加
    for i in range(max_length - 1, -1, -1):
        bit1 = int(binary1[i])
        bit2 = int(binary2[i])
        # 计算当前位的和以及进位
        sum_bits = bit1 + bit2 + carry
        carry = sum_bits // 2  # 计算进位
        result.append(str(sum_bits % 2))  # 将当前位的结果添加到结果列表
    # 如果最高位有进位,添加到结果列表
    if carry:
        result.append(str(carry))
    # 反转结果列表
    result.reverse()
    # 将二进制结果转换为十进制
    decimal_result = int(''.join(result), 2)
    return str(decimal_result)

总结

通过逐位相加并处理进位,我们可以将两个二进制字符串相加,并最终转换为十进制结果。这个方法的时间复杂度为 O(n),满足题目要求。