二进制之和 | 豆包MarsCode AI 刷题
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过 ( O(n^2) ) 的前提下,返回两个二进制字符串的十进制求和结果。本文将探讨如何实现这一目标,并提供详细的代码实现。
问题描述
给定两个二进制字符串 binary1 和 binary2,目标是将这两个二进制字符串相加,并将结果以十进制的形式返回。二进制字符串可能非常长,因此需要设计一个高效且准确的算法来处理大数。
解决方案
为了帮助小U和小R实现二进制字符串的十进制求和,我们可以分以下几个步骤来实现:
- 二进制字符串相加:
- 从两个二进制字符串的末尾开始,逐位相加,并处理进位。
- 将结果存储在一个列表中,最后将列表转换为字符串。
- 二进制字符串转换为十进制字符串:
- 使用列表来存储十进制数的每一位,从最低位到最高位。
- 逐位处理二进制字符串,每次将当前的十进制数乘以2,并加上当前的二进制位。
- 处理进位,确保每一位都在0-9之间。
- 返回结果:
- 将最终的十进制数列表转换为字符串并返回。
代码实现
def solution(binary1: str, binary2: str) -> str:
# Function to add two binary strings
def add_binary(b1, b2):
i = len(b1) - 1
j = len(b2) - 1
carry = 0
res = []
while i >= 0 or j >= 0 or carry:
bit1 = int(b1[i]) if i >= 0 else 0
bit2 = int(b2[j]) if j >= 0 else 0
total = bit1 + bit2 + carry
carry = total // 2
res.append(str(total % 2))
i -= 1
j -= 1
return ''.join(res[::-1])
# Function to convert binary string to decimal string
def binary_to_decimal(bin_str):
decimal = [0] # List to store each digit, least significant digit at the end
for bit in bin_str:
# Multiply current decimal by 2
carry = 0
for idx in range(len(decimal) - 1, -1, -1):
temp = decimal[idx] * 2 + carry
decimal[idx] = temp % 10
carry = temp // 10
if carry:
decimal = [carry] + decimal
# Add the current bit
if bit == '1':
carry = 1
for idx in range(len(decimal) - 1, -1, -1):
temp = decimal[idx] + carry
decimal[idx] = temp % 10
carry = temp // 10
if carry:
decimal = [carry] + decimal
return ''.join(map(str, decimal))
# Step 1: Add the binary strings
binary_sum = add_binary(binary1, binary2)
# Step 2: Convert the binary sum to decimal string
decimal_sum = binary_to_decimal(binary_sum)
return decimal_sum
if __name__ == "__main__":
print(solution("101", "110") == "11") # 输出: True
print(solution("111111", "10100") == "83") # 输出: True
print(solution("111010101001001011", "100010101001") == "242420") # 输出: True
print(solution("111010101001011", "10010101001") == "31220") # 输出: True
print(solution("11", "1") == "4") # 输出: True
代码解释
- 二进制字符串相加:
add_binary函数从两个二进制字符串的末尾开始,逐位相加,并处理进位。- 使用一个列表
res来存储结果,最后将列表反转并转换为字符串。
- 二进制字符串转换为十进制字符串:
binary_to_decimal函数使用一个列表decimal来存储十进制数的每一位,从最低位到最高位。- 逐位处理二进制字符串,每次将当前的十进制数乘以2,并加上当前的二进制位。
- 处理进位,确保每一位都在0-9之间。
- 最后将列表转换为字符串并返回。
- 返回结果:
binary_sum是两个二进制字符串相加的结果。decimal_sum是将binary_sum转换为十进制字符串的结果。
测试样例
- 样例1:
binary1 = "101", binary2 = "110",输出:11- 解释:二进制字符串 "101" 和 "110" 相加的结果是 "1011",转换为十进制是 11。
- 样例2:
binary1 = "111111", binary2 = "10100",输出:83- 解释:二进制字符串 "111111" 和 "10100" 相加的结果是 "1001011",转换为十进制是 83。
- 样例3:
binary1 = "111010101001001011", binary2 = "100010101001",输出:242420- 解释:二进制字符串 "111010101001001011" 和 "100010101001" 相加的结果是 "1000111110000000000",转换为十进制是 242420。
- 样例4:
binary1 = "111010101001011", binary2 = "10010101001",输出:31220- 解释:二进制字符串 "111010101001011" 和 "10010101001" 相加的结果是 "100011111000000000",转换为十进制是 31220。
- 样例5:
binary1 = "11", binary2 = "1",输出:4- 解释:二进制字符串 "11" 和 "1" 相加的结果是 "100",转换为十进制是 4。 通过上述方法,我们可以有效地帮助小U和小R实现二进制字符串的十进制求和,确保在处理大数时算法的时间复杂度不超过 ( O(n^2) )。