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

53 阅读5分钟

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

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

问题描述

给定两个二进制字符串 binary1binary2,目标是将这两个二进制字符串相加,并将结果以十进制的形式返回。二进制字符串可能非常长,因此需要设计一个高效且准确的算法来处理大数。

解决方案

为了帮助小U和小R实现二进制字符串的十进制求和,我们可以分以下几个步骤来实现:

  1. 二进制字符串相加
    • 从两个二进制字符串的末尾开始,逐位相加,并处理进位。
    • 将结果存储在一个列表中,最后将列表转换为字符串。
  2. 二进制字符串转换为十进制字符串
    • 使用列表来存储十进制数的每一位,从最低位到最高位。
    • 逐位处理二进制字符串,每次将当前的十进制数乘以2,并加上当前的二进制位。
    • 处理进位,确保每一位都在0-9之间。
  3. 返回结果
    • 将最终的十进制数列表转换为字符串并返回。

代码实现

def solution(binary1: str, binary2: str) -> str:
    # Function to add two binary strings
    def add_binary(b1, b2):
        i = len(b1) - 1
        j = len(b2) - 1
        carry = 0
        res = []
        while i >= 0 or j >= 0 or carry:
            bit1 = int(b1[i]) if i >= 0 else 0
            bit2 = int(b2[j]) if j >= 0 else 0
            total = bit1 + bit2 + carry
            carry = total // 2
            res.append(str(total % 2))
            i -= 1
            j -= 1
        return ''.join(res[::-1])
    # Function to convert binary string to decimal string
    def binary_to_decimal(bin_str):
        decimal = [0]  # List to store each digit, least significant digit at the end
        for bit in bin_str:
            # Multiply current decimal by 2
            carry = 0
            for idx in range(len(decimal) - 1, -1, -1):
                temp = decimal[idx] * 2 + carry
                decimal[idx] = temp % 10
                carry = temp // 10
            if carry:
                decimal = [carry] + decimal
            # Add the current bit
            if bit == '1':
                carry = 1
                for idx in range(len(decimal) - 1, -1, -1):
                    temp = decimal[idx] + carry
                    decimal[idx] = temp % 10
                    carry = temp // 10
                if carry:
                    decimal = [carry] + decimal
        return ''.join(map(str, decimal))
    # Step 1: Add the binary strings
    binary_sum = add_binary(binary1, binary2)
    # Step 2: Convert the binary sum to decimal string
    decimal_sum = binary_to_decimal(binary_sum)
    return decimal_sum
if __name__ == "__main__":
    print(solution("101", "110") == "11")  # 输出: True
    print(solution("111111", "10100") == "83")  # 输出: True
    print(solution("111010101001001011", "100010101001") == "242420")  # 输出: True
    print(solution("111010101001011", "10010101001") == "31220")  # 输出: True
    print(solution("11", "1") == "4")  # 输出: True

代码解释

  1. 二进制字符串相加
    • add_binary 函数从两个二进制字符串的末尾开始,逐位相加,并处理进位。
    • 使用一个列表 res 来存储结果,最后将列表反转并转换为字符串。
  2. 二进制字符串转换为十进制字符串
    • binary_to_decimal 函数使用一个列表 decimal 来存储十进制数的每一位,从最低位到最高位。
    • 逐位处理二进制字符串,每次将当前的十进制数乘以2,并加上当前的二进制位。
    • 处理进位,确保每一位都在0-9之间。
    • 最后将列表转换为字符串并返回。
  3. 返回结果
    • binary_sum 是两个二进制字符串相加的结果。
    • decimal_sum 是将 binary_sum 转换为十进制字符串的结果。

测试样例

  • 样例1binary1 = "101", binary2 = "110",输出:11
    • 解释:二进制字符串 "101" 和 "110" 相加的结果是 "1011",转换为十进制是 11。
  • 样例2binary1 = "111111", binary2 = "10100",输出:83
    • 解释:二进制字符串 "111111" 和 "10100" 相加的结果是 "1001011",转换为十进制是 83。
  • 样例3binary1 = "111010101001001011", binary2 = "100010101001",输出:242420
    • 解释:二进制字符串 "111010101001001011" 和 "100010101001" 相加的结果是 "1000111110000000000",转换为十进制是 242420。
  • 样例4binary1 = "111010101001011", binary2 = "10010101001",输出:31220
    • 解释:二进制字符串 "111010101001011" 和 "10010101001" 相加的结果是 "100011111000000000",转换为十进制是 31220。
  • 样例5binary1 = "11", binary2 = "1",输出:4
    • 解释:二进制字符串 "11" 和 "1" 相加的结果是 "100",转换为十进制是 4。 通过上述方法,我们可以有效地帮助小U和小R实现二进制字符串的十进制求和,确保在处理大数时算法的时间复杂度不超过 ( O(n^2) )。