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

86 阅读5分钟

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

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

问题描述

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

测试样例

  • 样例1

    • 输入:binary1 = "101"binary2 = "110"
    • 输出:'11'
  • 样例2

    • 输入:binary1 = "111111"binary2 = "10100"
    • 输出:'83'
  • 样例3

    • 输入:binary1 = "111010101001001011"binary2 = "100010101001"
    • 输出:'242420'
  • 样例4

    • 输入:binary1 = "111010101001011"binary2 = "10010101001"
    • 输出:'31220'
  • 样例5

    • 输入:binary1 = "11"binary2 = "1"
    • 输出:'4'

解题思路

二进制加法与十进制转换

在这个问题中,我们需要实现两个主要功能:将两个二进制字符串相加,并将结果转换为十进制字符串。具体思路如下:

  1. 二进制加法

    • 从两个二进制字符串的末尾开始,逐位相加。
    • 处理进位,确保每一位的值不超过1。
    • 将结果存储在一个列表中,最后反转列表并拼接成字符串。
  2. 二进制到十进制的转换

    • 初始化一个列表 decimal,用于存储十进制结果。
    • 从二进制字符串的末尾开始,逐位处理。
    • 对于每一位,更新 decimal 列表中的每一位,并处理进位。
    • 如果当前位为1,再进行一次逐位处理,确保进位正确。
    • 最后将 decimal 列表中的值拼接成字符串。

代码实现

python

复制代码

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])

    def binary_to_decimal(bin_str):
        decimal = [0]
        for bit in bin_str:
            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
            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 == 0:
                        break
                if carry:
                    decimal = [carry] + decimal
        return ''.join(map(str, decimal))

    binary_sum = add_binary(binary1, binary2)
    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

代码解析

  • add_binary 方法

    • 从两个二进制字符串的末尾开始,逐位相加。
    • 处理进位,确保每一位的值不超过1。
    • 将结果存储在一个列表中,最后反转列表并拼接成字符串。
  • binary_to_decimal 方法

    • 初始化一个列表 decimal,用于存储十进制结果。
    • 从二进制字符串的末尾开始,逐位处理。
    • 对于每一位,更新 decimal 列表中的每一位,并处理进位。
    • 如果当前位为1,再进行一次逐位处理,确保进位正确。
    • 最后将 decimal 列表中的值拼接成字符串。
  • solution 方法

    • 调用 add_binary 方法将两个二进制字符串相加。
    • 调用 binary_to_decimal 方法将二进制结果转换为十进制字符串。
    • 返回十进制字符串。
  • main 方法

    • 测试了五个样例,验证了 solution 方法的正确性。

时间和空间复杂度分析

  • 时间复杂度:O(n),其中 n 是二进制字符串的长度。我们只需要遍历字符串一次。
  • 空间复杂度:O(n),我们使用了列表来存储中间结果。

总结

通过实现二进制加法和二进制到十进制的转换,我们能够高效地解决这个问题,将两个二进制字符串相加并以十进制的形式呈现。这种方法不仅简洁,而且在实际应用中也非常实用。希望这篇文章能帮助你更好地理解和掌握这一技巧。如果你有任何问题或建议,欢迎在评论区留言讨论!