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

66 阅读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)理解问题

根据问题描述,我们需要将两个二进制字符串相加,并将它们相加的结果以十进制的形式返回。二进制字符串可能非常长,因此我们需要考虑大数处理的问题。

(2)数据结构选择

由于二进制字符串可能非常长,直接将其转换为整数可能会导致溢出。我们需要逐位处理二进制字符串,并且模拟二进制加法的过程。

(3)算法步骤

1.初始化变量:

我们先定义两个变量,一个列表 s 用来存储每一位的和,一个变量 t 用来存储进位。

2.反向遍历两个二进制字符串:

从字符串的最后一位开始,逐位相加,如果某个字符串已经遍历完,则将其对应的位视为 0

3.逐位相加并处理进位:

计算当前位的和 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

4.处理最后的进位:

如果遍历结束后仍有进位,则将其添加到 s 中。

5.计算结果的十进制值:

将 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")
    print(solution("11", "1") == "4")

四、时间复杂度:

该算法的时间复杂度为 O(n),其中 n 是两个二进制字符串中较长的那个的长度。而题目要求时间复杂度不超过 O(n^2),根据题意这个代码符合题目的要求。

五、总结:

通过逐位相加并处理进位这个方法,我们可以有效地处理大数问题,并最终将结果转换为我们需要的十进制形式。