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

62 阅读3分钟

问题描述

小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'

通过MarsCode AI进行解题思路分析

问题理解

你需要将两个二进制字符串相加,并以十进制的形式返回结果。由于二进制字符串可能非常长,常规的方法可能无法处理大数,因此需要设计一个高效的算法。

数据结构选择

  • 使用字符串来表示二进制数,因为字符串可以处理任意长度的数字。
  • 使用列表来存储每一位的加法结果,因为列表可以动态调整大小。

算法步骤

  1. 初始化变量

    • 使用两个指针 i 和 j 分别指向两个二进制字符串的末尾。
    • 使用一个变量 t 来存储进位。
    • 使用一个列表 s 来存储每一位的加法结果。
  2. 逐位相加

    • 从末尾开始,逐位相加两个二进制字符串的对应位。

    • 如果某一位不存在(即指针超出字符串范围),则视为0。

    • 计算当前位的和 total = a + b + t,其中 a 和 b 是当前位的值,t 是进位。

    • 根据 total 的值更新 s 和 t

      • 如果 total 是 3,则当前位为 1,进位为 1。
      • 如果 total 是 2,则当前位为 0,进位为 1。
      • 如果 total 是 1,则当前位为 1,进位为 0。
      • 如果 total 是 0,则当前位为 0,进位为 0。
  3. 处理最后的进位

    • 如果最后还有进位(即 t > 0),则将其加入 s
  4. 转换为十进制

    • 将列表 s 中的二进制结果转换为十进制数。
    • 返回十进制结果的字符串表示。

整理得出以下代码

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
        b = int(binary2[j]) if j >= 0 else 0

        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) 
    
    return str(ans)
    
if __name__ == "__main__":
    print(solution("101", "110") == "11")
    print(solution("111111", "10100") == "83")
    print(solution("111010101001001011", "100010101001") == "242420")
    print(solution("111010101001011", "10010101001") == "31220")