二进制之和题目分析过程和知识总结 | 豆包MarsCode AI 刷题

92 阅读3分钟

题目解析

题目分析

这个题目要求我们设计一个算法,能够将两个二进制字符串相加并返回它们的十进制和。关键点在于:

输入是两个非常长的二进制字符串,可能超出了普通整型变量的范围。 我们需要处理这些大数并在不超过 ( O(n^2) ) 的时间复杂度下完成求和。

解题思路

直接二进制加法

  • 我们可以模拟二进制加法的过程,从最低位(即二进制字符串的末尾)开始逐位加。

  • 每一位的加法结果包括当前位和进位。这个过程类似于传统的竖式加法。

  • 加法过程中需要注意以下几点:

    需要从右到左依次处理每一位,并维护一个进位值。

    如果两个位相加超过了1(即产生了进位),我们就把进位加到下一位。

方法实现

  • 对齐两者长度:首先如果两个二进制字符串长度不同,可以通过在较短的字符串前面补 0 来进行对齐。
  • 逐位加法:从右到左逐位加,同时记录进位。
  • 进位处理:如果当前位的和大于1(即产生了进位),则进位值为1,当前位为 和 - 2。

二进制转化为十进制

  • 二进制加法完成后,我们得到一个新的二进制字符串。我们需要将这个二进制字符串转换为十进制。
  • 这个转换可以通过将二进制字符串从左到右逐位加权求和实现。

知识总结

通过模拟二进制加法的过程,并处理进位,我们能够在 ( O(n) ) 时间复杂度内完成两二进制字符串的加法,并返回结果的十进制表示。这个方法不仅高效,而且能够处理任意长的二进制字符串。

学习计划

  • 分阶段学习:将大的目标拆分为多个小的阶段,每个阶段有清晰的任务。
  • 基础阶段:从简单题开始,打牢基础。
  • 进阶阶段:解决中等难度的题目,强化算法设计和数据结构的掌握。
  • 实战阶段:通过模拟面试题目,提升解决问题的速度和准确性。

工具运用

  • MarsCode AI 可以根据学习进度和水平智能推荐适合的题目,可以避免过多浪费时间选择题目,减少选择障碍。
  • 将题目分为初级、中级、难度高的几类,逐步挑战自己的极限。MarsCode AI 会根据每个题目的难度,合理安排刷题顺序。
    # 对齐长度,补零
    max_len = max(len(bin1), len(bin2))
    bin1 = bin1.zfill(max_len)
    bin2 = bin2.zfill(max_len)
    
    carry = 0  # 进位
    result = []  # 存储加法结果
    # 从右到左逐位加
    for i in range(max_len - 1, -1, -1):
        bit1 = int(bin1[i])  # 获取当前位的值
        bit2 = int(bin2[i])  # 获取当前位的值
        total = bit1 + bit2 + carry  # 当前位的总和
        result.append(str(total % 2))  # 当前位的值 (0或1)
        carry = total // 2  # 更新进位
    
    if carry:  # 如果最终还有进位
        result.append('1')
    
    # 结果是倒序的,需要反转
    result.reverse()
    
    # 将结果的二进制转换为十进制
    decimal_result = int(''.join(result), 2)
    
    # 将十进制结果转换为字符串形式
    return str(decimal_result)

# 测试示例
bin1 = "101"
bin2 = "111"
print(addBinary(bin1, bin2))  # 输出 "12"