编程笔记:二进制之和 | 豆包MarsCode AI刷题

42 阅读5分钟

题目解析

本题要求我们将两个二进制字符串进行相加,并输出它们的十进制和。二进制字符串可能非常长,因此常规的直接转换为十进制再求和的方法可能会导致溢出或效率低下。我们需要设计一种方法,在保证时间复杂度不超过 �(�2)O(n2) 的前提下,完成这一任务。

问题分析

  1. 二进制加法:
    我们需要模拟二进制加法的过程,逐位加起来,并处理进位。假设有两个二进制字符串 binary1binary1 和 binary2binary2,它们的长度分别为 �n 和 �m。
  2. 进位处理:
    在二进制加法中,每一位的和最多为 2(即 1 + 1 = 10),因此会有进位。我们需要从低位到高位逐步加,处理进位,并把结果存储在一个新的列表中。
  3. 字符串反转:
    为了方便从最低位开始加,我们可以将两个二进制字符串反转。这样,我们就可以从字符串的第一个字符(反转后的最低位)开始处理。
  4. 最后进位:
    加法结束后,如果有进位(即最终的 carry 不为 0),需要将其添加到结果的末尾。
  5. 转换为十进制:
    最终的结果是一个二进制字符串,我们可以将其转换为十进制数返回。

解决思路

  1. 初始化:
    初始化一个 carry 变量用于记录进位,初始化一个空列表 result 来存储每一位的加法结果。
  2. 反转字符串:
    将二进制字符串反转,使得我们从低位开始逐位加。
  3. 逐位加法:
    对于每一位,获取两个二进制数字的当前位,并加上进位。如果当前位不够长(即某个字符串已经结束),可以认为该位为 0。
  4. 处理进位:
    每次计算完当前位的和后,根据和的值判断是否有进位。如果有,将进位传递到下一位。
  5. 转换为十进制:
    最后将二进制字符串反转并转换成十进制数,返回结果。

代码实现

pythonCopy Code
def solution(binary1, binary2):
    # 确保binary1是较长的二进制字符串
    if len(binary1) < len(binary2):
        binary1, binary2 = binary2, binary1
    
    # 初始化结果
    result = []
    carry = 0
    
    # 反转二进制字符串,从低位开始加
    binary1 = binary1[::-1]
    binary2 = binary2[::-1]
    
    # 遍历二进制字符串的每一位
    for i in range(len(binary1)):
        # 获取当前位的数字
        bit1 = int(binary1[i])
        bit2 = int(binary2[i]) if i < len(binary2) else 0
        
        # 计算当前位的和
        total = bit1 + bit2 + carry
        
        # 结果的当前位
        result.append(str(total % 2))
        
        # 更新进位
        carry = total // 2
    
    # 如果最后有进位,添加到结果中
    if carry:
        result.append(str(carry))
    
    # 将结果反转回正确顺序
    result.reverse()
    
    # 将结果作为二进制数转换为十进制
    return str(int(''.join(result), 2))

代码详解

  1. 处理输入:

    pythonCopy Code
    if len(binary1) < len(binary2):
        binary1, binary2 = binary2, binary1
    

    这里确保 binary1 是较长的二进制字符串。这样可以避免在加法过程中出现 binary1 需要补零的情况。

  2. 反转字符串:

    pythonCopy Code
    binary1 = binary1[::-1]
    binary2 = binary2[::-1]
    

    反转两个二进制字符串,以便从最低位开始逐位加。

  3. 逐位加法:

    pythonCopy Code
    for i in range(len(binary1)):
        bit1 = int(binary1[i])
        bit2 = int(binary2[i]) if i < len(binary2) else 0
        total = bit1 + bit2 + carry
        result.append(str(total % 2))
        carry = total // 2
    

    在循环中,我们从最低位开始逐位加,计算当前位的和。如果有进位,则将进位传递到下一位。通过取模操作 (total % 2),我们得到当前位的二进制值。进位则通过整除操作 (total // 2) 计算。

  4. 处理最终的进位:

    pythonCopy Code
    if carry:
        result.append(str(carry))
    

    如果最后有进位(即 carry 不为 0),将进位添加到结果的末尾。

  5. 反转结果并转换为十进制:

    pythonCopy Code
    result.reverse()
    return str(int(''.join(result), 2))
    

    由于我们之前反转了字符串,所以最后的 result 需要再反转回原来的顺序。然后将结果从二进制转换为十进制,并返回字符串形式的结果。

时间复杂度

  • 反转字符串的操作需要 �(�)O(n) 时间,其中 �n 是较长的二进制字符串的长度。
  • 遍历二进制字符串的每一位进行加法需要 �(�)O(n) 时间。
  • 最终将结果从二进制转换为十进制也是 �(�)O(n) 的操作。

因此,整体时间复杂度为 �(�)O(n),其中 �n 是较长的二进制字符串的长度。题目要求的时间复杂度是 �(�2)O(n2),我们在这里的实现满足这一要求。

总结与知识点

  1. 模拟二进制加法:
    本题的关键在于模拟二进制加法的过程,逐位处理并管理进位。
  2. 字符串反转与逐位操作:
    通过反转字符串,可以使加法从低位开始,简化加法过程。
  3. 进位的处理:
    每次加法后,需要检查是否有进位,并在最终添加到结果中。
  4. 二进制到十进制转换:
    最终的二进制结果可以通过 Python 的内建函数 int(binary_str, 2) 转换为十进制。