“二进制之和”问题解析思路 | 豆包MarsCode AI刷题

5 阅读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**(n-j) 来计算每个位的十进制值,其中 n 是字符串长度,j 是当前位的索引。
  2. 累加两个十进制数

    • 将两个二进制字符串分别转换为十进制数,然后将这两个十进制数相加。
  3. 返回结果

    • 将最终的十进制结果转换为字符串形式返回。

代码框架

def solution(binary1, 

binary2):

    # 将 binary1 转换为十进制

    n, j = len(binary1) - 

    1, len(binary1) - 1

    decimal1 = 0

    while j >= 0:

        if binary1[j] == 

        '1':

            decimal1 += 2 

            ** (n - j)

        j -= 1

    # 将 binary2 转换为十进制

    n, j = len(binary2) - 

    1, len(binary2) - 1

    decimal2 = 0

    while j >= 0:

        if binary2[j] == 

        '1':

            decimal2 += 2 

            ** (n - j)

        j -= 1

    # 将两个十进制数相加

    result = decimal1 + 

    decimal2

    # 返回结果

    return str(result)

if name == "main":

    # 你可以添加更多测试用例

    print(solution("101", 

    "110") == "11")

    print(solution

    ("111111", "10100") == 

    "83")

    print(solution

    ("111010101001001011", 

    "100010101001") == 

    "242420")

    print(solution

    ("111010101001011", 

    "10010101001") == 

    "31220")

关键点

  • 幂运算:使用 2**(n-j) 来计算每个位的十进制值。
  • 累加:将两个二进制字符串分别转换为十进制数后相加。 对于这种将两个二进制字符串相加并以十进制形式返回结果的题目,切入点主要集中在以下几个方面:

1. 理解二进制和十进制的转换

  • 二进制到十进制的转换:每个二进制位代表一个2的幂次方。例如,二进制字符串 "101" 可以转换为十进制 1*2^2 + 0*2^1 + 1*2^0 = 5
  • 十进制到字符串的转换:最终结果需要以字符串形式返回,因此需要将十进制数转换为字符串。

2. 处理大数问题

  • 大数问题:由于二进制字符串可能非常长,直接使用整数类型可能会导致溢出。因此,我们需要设计一个算法,能够在不依赖大整数类型的情况下处理大数。

3. 算法设计

  • 逐位处理:从二进制字符串的最低位(最右端)开始,逐位计算其对应的十进制值并累加。
  • 幂运算:使用 2**(n-j) 来计算每个位的十进制值,其中 n 是字符串长度,j 是当前位的索引。

4. 代码实现

  • 循环遍历:使用循环遍历二进制字符串的每一位。
  • 累加结果:将每个位的十进制值累加到结果中。

5. 测试和验证

  • 测试用例:设计多个测试用例来验证代码的正确性,特别是边界情况和大数情况。