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

127 阅读5分钟

题目解析:二进制之和

小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. 问题分析

  • 输入是两个二进制字符串 binary1 和 binary2
  • 我们需要按照二进制加法规则(从最低位到最高位)逐位相加,处理进位,直到所有的二进制位都处理完。
  • 结果最终是一个二进制字符串,需要将其转换为十进制,并返回其字符串表示。

2. 二进制加法

  • 二进制加法的基本规则:

    • 0 + 0 = 0 (无进位)
    • 0 + 1 = 1 或 1 + 0 = 1 (无进位)
    • 1 + 1 = 10 (有进位,结果为0,进位为1)
    • 1 + 1 + 1 = 11 (有进位,结果为1,进位为1)
  • 需要从两个二进制字符串的最后一位(最低位)开始逐位相加,计算每一位的和,并处理进位。

3. 具体步骤

  1. 初始化:

    • 用一个列表 s 来存储加法结果的每一位,注意这里是反向存储(二进制结果从最低位开始存)。
    • 用变量 t 来存储进位(初始值为0)。
  2. 逐位相加:

    • 从两个字符串的末尾开始逐位相加,处理对应的位。如果一个字符串比另一个长,缺失的位认为是0。

    • 每次加法之后,计算当前位的和:

      • 如果和为 3 (1 + 1 + 1),则当前位为 1,进位 t 设置为 1。
      • 如果和为 2 (1 + 1),则当前位为 0,进位 t 设置为 1。
      • 如果和为 1,当前位为 1,进位 t 设置为 0。
      • 如果和为 0,当前位为 0,进位 t 设置为 0。
  3. 处理剩余进位:

    • 当所有位都加完后,如果还有进位(t > 0),则需要将进位 1 加入到结果中。
  4. 构造二进制结果:

    • 最终的二进制结果存储在 s 中,注意 s 是反向存储的,所以在计算十进制时需要按位置逆序计算其值。
  5. 二进制转换为十进制:

    • 将二进制字符串(反向存储的 s)转换为十进制。每个二进制位可以通过 2^i 来转换为十进制值,其中 i 是二进制位的索引。

4. 代码实现

pythonCopy Code
def solution(binary1, binary2):
    s = []  # 存储二进制加法的每一位
    t = 0  # 进位
    
    # 反向遍历两个二进制字符串
    i, j = len(binary1) - 1, len(binary2) - 1
    while i >= 0 or j >= 0:
        a = int(binary1[i]) if i >= 0 else 0  # 取出binary1当前位的数字
        b = int(binary2[j]) if j >= 0 else 0  # 取出binary2当前位的数字

        total = a + b + t  # 计算当前位的总和
        if total == 3:
            s.append(1)
            t = 1
        elif total == 2:
            s.append(0)
            t = 1
        elif total == 1:
            s.append(1)
            t = 0
        else:
            s.append(0)
            t = 0
        
        i -= 1  # 继续处理前一位
        j -= 1  # 继续处理前一位

    # 如果还有进位,添加到结果
    if t > 0:
        s.append(1)
    
    # 将二进制结果转为十进制
    ans = 0
    for idx in range(len(s)):
        ans += s[idx] * (2 ** idx)  # 二进制位乘以对应的2的幂次方
    
    return str(ans)  # 返回十进制结果的字符串形式

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"

5. 优化与注意事项

  • 处理进位:  在每一轮加法中,我们始终保持 t 变量来记录是否有进位,直到所有位加完。
  • 长度不一致的情况:  如果两个二进制字符串的长度不一致,较短的字符串会被补充为 0。
  • 处理进位的最后一步:  如果循环结束后进位 t 仍然大于 0,需要将它添加到结果列表中。
  • 二进制到十进制的转换:  由于二进制的位数是从低位到高位存储的,转换为十进制时要按照指数次幂的方式计算。

6. 总结

这个问题通过模拟二进制加法来解决,从最低位开始逐位相加,并处理进位,最后将二进制结果转换为十进制。这个解法避免了直接使用内建的二进制加法功能,展示了如何手动处理二进制加法的每一步。

心得:

使用MarsCode AI编写代码让我体验到了编程的便利与高效。AI能够快速生成代码示例,帮助我理解不同编程概念。通过交互式的反馈,我能迅速调整思路,解决问题。同时,MarsCode AI提供的建议让我了解到更多最佳实践,提升了我的编码水平。这种工具不仅节省了时间,还激发了我的创造力,尤其是在处理复杂问题时,AI的支持显得尤为重要。总的来说,MarsCode AI是编程学习和实践中的得力助手。