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

37 阅读3分钟

简单记录一下《二进制之和》这道题解题思路。

题面如下:

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

样例1:

输入binary1 = "101" ,binary2 = "110",相加得1011,转化为十进制结果是11

样例2:

输入binary1 = "111111",binary2 = "10100"相加得1010011,转化为十进制结果是83

样例3:

输入binary1 = "111010101001001011" ,binary2 = "100010101001"相加得111011001011110100,转化为十进制结果是242420

样例4:

输入binary1 = "111010101001011" ,binary2 = "10010101001"相加得111100111110100,转化为十进制结果是31220

样例5:

输入binary1 = "11" ,binary2 = "1"相加得100,转化为十进制结果是4

解题思路

这个问题非常明显,需要我们分别计算两个二进制字符串的和,然后利用二进制和十进制之间的转换规则将其转换为十进制的值。

我们可以对问题进行拆解:

1、首先根据二进制数字的加法规则,我们可以设计一个函数add_binary_strings来计算两个二进制字符串的和,我们使用两个指针分别从两个字符串的末尾开始,逐位相加。同时,我们定义一个新变量 carry用来处理进位情况:对于每一次相加,都对结果模2得到当前位的值,整除2得到进位。当然,由于结果是从低位到高位进行计算和存储,最后需要反转结果列表。

2、其次,我们设计另一个函数binary_to_decimal来将计算好的二进制之和转换为十进制数。我们定义一个新变量 decimal_value用来存储当前的十进制值,通过遍历二进制字符串中的每一位字符,每次将decimal_value * 2再加上当前位的值。最终返回计算好的decimal_value

3、最后再 solution 函数中将上面两个函数整合,最终返回对应的十进制结果。

完整代码如下:

def add_binary_strings(a, b):
    # 初始化变量
    i = len(a) - 1
    j = len(b) - 1
    carry = 0
    result = []
    
    # 从右到左逐位相加
    while i >= 0 or j >= 0 or carry:
        digit_a = int(a[i]) if i >= 0 else 0
        digit_b = int(b[j]) if j >= 0 else 0
        sum_digits = digit_a + digit_b + carry
        
        result.append(sum_digits % 2)
        carry = sum_digits // 2
        
        i -= 1
        j -= 1
    
    # 结果是反向的,需要反转
    result.reverse()
    return ''.join(map(str, result))

def binary_to_decimal(binary_str):
    decimal_value = 0
    for digit in binary_str:
        decimal_value = decimal_value * 2 + int(digit)
    return decimal_value

def solution(binary1, binary2):
    # 计算二进制字符串的和
    binary_sum = add_binary_strings(binary1, binary2)
    
    # 将二进制和转换为十进制
    decimal_sum = binary_to_decimal(binary_sum)
    
    # 返回结果
    return str(decimal_sum)

运行代码,可以看到结果也是正确的:

image.png