简单记录一下《二进制之和》这道题解题思路。
题面如下:
问题描述
小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)
运行代码,可以看到结果也是正确的: