二进制之和 | 豆包MarsCode AI 刷题
在编程的世界里,处理二进制字符串的运算是一个常见的任务。今天,我们来探讨一个具体的题目:小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。
问题描述
小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。
- 将结果存储在一个列表中,最后反转列表并拼接成字符串。
-
二进制到十进制的转换:
- 初始化一个列表
decimal,用于存储十进制结果。 - 从二进制字符串的末尾开始,逐位处理。
- 对于每一位,更新
decimal列表中的每一位,并处理进位。 - 如果当前位为1,再进行一次逐位处理,确保进位正确。
- 最后将
decimal列表中的值拼接成字符串。
- 初始化一个列表
代码实现
python
复制代码
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])
def binary_to_decimal(bin_str):
decimal = [0]
for bit in bin_str:
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
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 == 0:
break
if carry:
decimal = [carry] + decimal
return ''.join(map(str, decimal))
binary_sum = add_binary(binary1, binary2)
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方法:- 从两个二进制字符串的末尾开始,逐位相加。
- 处理进位,确保每一位的值不超过1。
- 将结果存储在一个列表中,最后反转列表并拼接成字符串。
-
binary_to_decimal方法:- 初始化一个列表
decimal,用于存储十进制结果。 - 从二进制字符串的末尾开始,逐位处理。
- 对于每一位,更新
decimal列表中的每一位,并处理进位。 - 如果当前位为1,再进行一次逐位处理,确保进位正确。
- 最后将
decimal列表中的值拼接成字符串。
- 初始化一个列表
-
solution方法:- 调用
add_binary方法将两个二进制字符串相加。 - 调用
binary_to_decimal方法将二进制结果转换为十进制字符串。 - 返回十进制字符串。
- 调用
-
main方法:- 测试了五个样例,验证了
solution方法的正确性。
- 测试了五个样例,验证了
时间和空间复杂度分析
- 时间复杂度:O(n),其中 n 是二进制字符串的长度。我们只需要遍历字符串一次。
- 空间复杂度:O(n),我们使用了列表来存储中间结果。
总结
通过实现二进制加法和二进制到十进制的转换,我们能够高效地解决这个问题,将两个二进制字符串相加并以十进制的形式呈现。这种方法不仅简洁,而且在实际应用中也非常实用。希望这篇文章能帮助你更好地理解和掌握这一技巧。如果你有任何问题或建议,欢迎在评论区留言讨论!