题目解析 | 豆包MarsCode AI刷题

91 阅读6分钟

题目解析:二进制之后

题目描述

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

输入输出示例

  • 输入

    • binary1 = "101"
    • binary2 = "110"
  • 输出"11"

解释

  • binary1 = "101" 对应的十进制值是 5。

  • binary2 = "110" 对应的十进制值是 6。

  • 它们的和是 5 + 6 = 11。

  • 输入

    • binary1 = "111111"
    • binary2 = "10100"
  • 输出"83"

解释

  • binary1 = "111111" 对应的十进制值是 63。

  • binary2 = "10100" 对应的十进制值是 20。

  • 它们的和是 63 + 20 = 83。

  • 输入

    • binary1 = "111010101001001011"
    • binary2 = "100010101001"
  • 输出"242420"

解释

  • binary1 = "111010101001001011" 对应的十进制值是 242420。
  • binary2 = "100010101001" 对应的十进制值是 1161。
  • 它们的和是 242420 + 1161 = 243581。

解题思路

这道题的本质是将两个二进制字符串转换为十进制数,然后求和,并将结果转换回十进制字符串。

解题步骤

  1. 二进制转十进制:我们可以使用 Python 的内建函数 int(x, 2),将二进制字符串 x 转换为十进制整数。这个函数会自动处理二进制字符串的解析,不需要我们手动实现。
  2. 求和:将两个十进制数相加,得到最终的结果。
  3. 返回结果:返回求和结果的十进制字符串。Python 的 str() 函数可以将一个整数转换为字符串。
关键点:
  • 由于题目要求的是二进制字符串相加,因此我们首先将二进制字符串转换为整数进行加法操作,再将结果转换回字符串。
  • Python 的 int(x, 2) 能够高效处理大整数,因此即使二进制数非常长,也不需要担心溢出问题。

代码实现

python
复制代码
def solution(binary1, binary2):
    # 将二进制字符串转换为十进制整数
    b1 = int(binary1, 2)
    b2 = int(binary2, 2)

    # 计算两个整数的和
    total = b1 + b2

    # 将结果转换为字符串并返回
    return str(total)

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"

代码解析

  1. int(binary1, 2) :将二进制字符串 binary1 转换为十进制整数。

    • 例如,int("101", 2) 会将二进制字符串 "101" 转换为十进制数字 5
  2. b1 + b2:计算两个转换后的十进制数的和。

  3. str(total) :将计算得到的十进制和转换为字符串形式,以符合题目要求的返回值格式。

  4. 测试用例:在 if __name__ == "__main__": 部分,列出了几个测试用例,确保代码逻辑的正确性。

复杂度分析

  • 时间复杂度

    • 转换二进制字符串为十进制整数的时间复杂度是 O(n) ,其中 n 是二进制字符串的长度。
    • 两个整数相加的时间复杂度是 O(1) (加法是常数时间操作)。
    • 因此,整体时间复杂度是 O(n) ,其中 n 是较长的二进制字符串的长度。
  • 空间复杂度

    • 我们使用了几个额外的变量 b1b2 来存储十进制数,并没有使用额外的复杂数据结构。
    • 因此,空间复杂度是 O(1)

测试样例解析

  1. 测试样例 1

    • 输入:binary1 = "101", binary2 = "110"

    • 转换为十进制:

      • binary1 = "101" → 十进制是 5
      • binary2 = "110" → 十进制是 6
    • 求和:5 + 6 = 11

    • 输出:"11"

  2. 测试样例 2

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

    • 转换为十进制:

      • binary1 = "111111" → 十进制是 63
      • binary2 = "10100" → 十进制是 20
    • 求和:63 + 20 = 83

    • 输出:"83"

  3. 测试样例 3

    • 输入:binary1 = "111010101001001011", binary2 = "100010101001"

    • 转换为十进制:

      • binary1 = "111010101001001011" → 十进制是 242420
      • binary2 = "100010101001" → 十进制是 1161
    • 求和:242420 + 1161 = 243581

    • 输出:"243581"

总结

这道题通过 Python 的内建函数 int(x, 2) 来轻松地将二进制字符串转换为十进制整数,然后通过加法计算得到结果,再将结果转换为字符串输出。整体解决方案简洁高效,时间复杂度为 O(n) ,空间复杂度为 O(1) ,非常适合处理大数的求和问题。

个人思考

这道题的解决方案它揭示了在处理大数和进制转换时的一些细节和挑战。通过使用 Python 的内建函数 int(x, 2),我们能够轻松实现二进制字符串到十进制整数的转换,并进行加法操作。Python 的大整数支持和高效的内存管理使得我们能够非常方便地处理大数问题,不需要担心溢出或性能瓶颈。

从算法优化的角度来看,我们不仅仅是依赖 Python 强大的内建库,还能通过对数据结构和算法的优化,降低问题的复杂度。在其他编程语言中,我们可能需要使用专门的大数库来实现类似的功能,而 Python 提供的灵活性使得我们能够在很短的时间内实现一个高效的解决方案。

通过这道题,我们不仅学习了如何处理二进制和十进制之间的转换,还体会到了语言底层如何处理大数的问题。这些思考对我们理解数字表示和计算机内部运算有着重要的意义。