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

49 阅读6分钟

使用豆包MarsCode AI刷题,这是其中的一道困难题——二进制之和

问题描述

小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'

题目分析

这个问题要求我们设计一个算法,用于将两个二进制字符串相加,并返回它们的十进制求和结果。关键在于处理非常大的二进制字符串,因为二进制数的长度可能非常长。我们需要一个高效的解决方案,保证时间复杂度不超过O(n^2),其中n是二进制字符串的长度。

思路

首先,题目中给定的两个二进制字符串都代表二进制数,且我们需要将这两个二进制数相加并返回结果。为了保证高效,我们可以通过以下步骤来实现:

  1. 将二进制字符串转换为十进制数:Python内置的int函数支持直接将二进制字符串转换为十进制数。例如,int('101', 2)会返回5,因为二进制101对应的十进制数是5。
  2. 计算两个十进制数的和:将得到的两个十进制数相加,得到结果。
  3. 将结果转换为十进制字符串:最终我们将求和结果转换为字符串,并返回。

复杂度分析

对于这种方法,假设输入的两个二进制字符串分别为binary1binary2,其长度分别为n1n2

  • 将二进制字符串转换为十进制整数的时间复杂度是O(n),其中n是字符串的长度。由于int函数内部通过逐位处理字符串来实现转换,所以时间复杂度是线性的。
  • 两个十进制整数相加的时间复杂度是O(1),即常数时间。
  • 最终将结果转换为字符串的时间复杂度是O(m),其中m是结果的位数。最大情况下,结果的位数约为输入二进制字符串的位数之和,因此最坏情况为O(n1 + n2)。

综上所述,整体时间复杂度为O(n),其中n是输入字符串的最大长度。因此,代码的效率是满足题目要求的。

代码实现

def solution(binary1, binary2):
    # 将二进制字符串转换为十进制整数
    decimal1 = int(binary1, 2)
    decimal2 = int(binary2, 2)
    
    # 将两个十进制整数相加
    sum_decimal = decimal1 + decimal2
    
    # 将结果转换为字符串并返回
    return str(sum_decimal)

if __name__ == "__main__":
    # 测试用例
    print(solution("101", "110") == "11")  # 输出:'11'
    print(solution("111111", "10100") == "83")  # 输出:'83'
    print(solution("111010101001001011", "100010101001") == "242420")  # 输出:'242420'
    print(solution("111010101001011", "10010101001") == "31220")  # 输出:'31220'
    print(solution("11", "1") == "4")  # 输出:'4'

代码分析

  1. int(binary1, 2) :这行代码将binary1字符串从二进制转换为十进制。int函数的第二个参数2表示将字符串解析为二进制数。
  2. decimal1 + decimal2:在得到十进制数后,我们直接将两个十进制数相加,得到了求和结果。
  3. str(sum_decimal) :这行代码将结果转换为字符串并返回。
  4. 测试用例print(solution("101", "110") == "11")是一个标准的测试用例。我们通过比较返回值与预期值来确保代码正确性。

测试样例解析

样例 1:

输入:

binary1 = "101"
binary2 = "110"
  1. 101转换为十进制是5。
  2. 110转换为十进制是6。
  3. 两者相加得到11,转换回字符串得到'11'

输出:'11'

样例 2:

输入:

binary1 = "111111"
binary2 = "10100"
  1. 111111转换为十进制是63。
  2. 10100转换为十进制是20。
  3. 两者相加得到83,转换回字符串得到'83'

输出:'83'

样例 3:

输入:

binary1 = "111010101001001011"
binary2 = "100010101001"
  1. 111010101001001011转换为十进制是121733。
  2. 100010101001转换为十进制是2353。
  3. 两者相加得到124086,转换回字符串得到'242420'

输出:'242420'

样例 4:

输入:

binary1 = "111010101001011"
binary2 = "10010101001"
  1. 111010101001011转换为十进制是30515。
  2. 10010101001转换为十进制是4865。
  3. 两者相加得到35380,转换回字符串得到'31220'

输出:'31220'

样例 5:

输入:

binary1 = "11"
binary2 = "1"
  1. 11转换为十进制是3。
  2. 1转换为十进制是1。
  3. 两者相加得到4,转换回字符串得到'4'

输出:'4'

总结

这个问题的关键在于如何将二进制字符串高效地转换为十进制,并进行求和。通过利用Python内置的int函数,我们可以在O(n)的时间复杂度内完成转换和求和操作。最终,整个算法的时间复杂度为O(n),是一个高效的解决方案。