青训营X豆包MarsCode 技术训练营:二进制之和Python3题解| 豆包MarsCode AI 刷题

38 阅读4分钟

二进制之和

问题描述

小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. 二进制字符串转换为整数

    • 你可以使用 Python 内置的 int 函数将二进制字符串转换为整数。例如,int("101", 2) 会将二进制字符串 "101" 转换为整数 5
  2. 整数相加

    • 将两个二进制字符串转换为整数后,直接相加即可。
  3. 整数转换为十进制字符串

    • 将相加后的整数转换为十进制字符串。你可以使用 str 函数将整数转换为字符串。
  4. 处理大数

    • Python 的整数类型可以处理任意大小的整数,因此你不需要担心大数问题。

Python3代码(通过豆包Marscode测试)

def solution(binary1, binary2):
    # 将二进制字符串转换为整数
    int1 = int(binary1, 2)
    int2 = int(binary2, 2)
    
    # 将两个整数相加
    sum_int = int1 + int2
    
    # 将结果转换为十进制字符串
    result = str(sum_int)
    
    return result

处理二进制字符串长度不一致

处理二进制字符串长度不一致的情况可以通过在较短的字符串前面补零来实现。这样两个字符串的长度就会一致,便于后续的逐位相加操作。

以下是一个示例代码(通过豆包Marscode测试),展示了如何处理二进制字符串长度不一致的情况:

def solution(binary1, binary2):
    # 计算两个二进制字符串的长度
    len1 = len(binary1)
    len2 = len(binary2)
    
    # 在较短的字符串前面补零,使两个字符串长度一致
    if len1 < len2:
        binary1 = '0' * (len2 - len1) + binary1
    elif len2 < len1:
        binary2 = '0' * (len1 - len2) + binary2
    
    # 现在两个字符串的长度一致,可以进行逐位相加操作
    # 将二进制字符串转换为整数
    int1 = int(binary1, 2)
    int2 = int(binary2, 2)
    
    # 将两个整数相加
    sum_int = int1 + int2
    
    # 将结果转换为十进制字符串
    result = str(sum_int)
    
    return result

解释

  1. 计算长度:首先计算两个二进制字符串的长度。
  2. 补零:如果两个字符串的长度不一致,在较短的字符串前面补零,使其长度与较长的字符串一致。
  3. 转换和相加:将两个长度一致的二进制字符串转换为整数,相加后转换为十进制字符串。

这样,无论输入的二进制字符串长度是否一致,代码都能正确处理并返回结果。

时间复杂度分析

  1. 计算长度:计算两个字符串的长度,时间复杂度为 O(1)
  2. 补零:在较短的字符串前面补零,时间复杂度为 O(n),其中 n 是较长的字符串的长度。
  3. 转换为整数:将二进制字符串转换为整数,时间复杂度为 O(n)
  4. 相加:将两个整数相加,时间复杂度为 O(1)
  5. 转换为字符串:将整数转换为字符串,时间复杂度为 O(m),其中 m 是结果的长度。

综合来看,主要的时间复杂度来自于补零和转换为整数的操作,因此总的时间复杂度为 O(n)

空间复杂度分析

  1. 补零:在较短的字符串前面补零,空间复杂度为 O(n),其中 n 是较长的字符串的长度。
  2. 整数转换:将二进制字符串转换为整数,空间复杂度为 O(1)
  3. 相加:将两个整数相加,空间复杂度为 O(1)
  4. 字符串转换:将整数转换为字符串,空间复杂度为 O(m),其中 m 是结果的长度。

综合来看,主要的空间复杂度来自于补零操作,因此总的空间复杂度为 O(n)

总结

  • 时间复杂度O(n),其中 n 是较长的二进制字符串的长度。
  • 空间复杂度O(n),其中 n 是较长的二进制字符串的长度。