55题二进制之和
问题描述
小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'
题目分析
这道题要求将两个非常长的二进制字符串相加,并以十进制的形式返回其和。由于二进制字符串可能很长,不能直接转化为整型处理,因此需要一种有效的算法在限制的时间复杂度内完成计算。
于是这题有其中一种思路是这样的:
解题思路一:
方法:逐位模拟二进制加法
我们可以通过模拟二进制加法的过程来解决问题,具体步骤如下:
-
初始化指针和进位:从两个字符串的末尾开始,逐位进行加法。使用
carry变量记录进位。 -
逐位计算和:逐位计算当前位的和,加上进位。计算结果对 2 取余,更新当前位的值。计算结果除以 2,更新进位。
-
处理剩余进位:当遍历结束后,如果仍有进位,追加到结果中。
-
转换为十进制:最后将计算出的二进制和直接转换为十进制。
代码实现
def solution:
# 初始化指针和进位
i, j = len(binary1) - 1, len(binary2) - 1
carry = 0
result = []
# 模拟逐位加法
while i >= 0 or j >= 0 or carry:
bit1 = int(binary1[i]) if i >= 0 else 0
bit2 = int(binary2[j]) if j >= 0 else 0
# 计算当前位的和
total = bit1 + bit2 + carry
result.append(total % 2) # 当前位的值
carry = total // 2 # 更新进位
# 更新指针
i -= 1
j -= 1
# 转换结果为十进制
binary_sum = ''.join(map(str, reversed(result)))
return str(int(binary_sum, 2))
关键点总结
- 逐位加法:通过从低位到高位模拟二进制加法,避免处理大数。
- 进位处理:注意在所有位都遍历完后仍需检查是否有进位。
- 转换十进制:最终的二进制和可以直接用内置函数
int(binary_string, 2)转为十进制。 - 如果要求直接返回二进制结果,也可以在上述算法中省略十进制转换的步骤,只需要返回
''.join(map(str, reversed(result)))即可。该算法非常灵活,可以根据具体需求调整返回值。
解题思路
本问题的关键在于将二进制字符串相加并返回十进制结果。我们可以通过以下步骤完成:
-
二进制转十进制:
- 将输入的二进制字符串转化为十进制整数。Python 提供了内置的
int()方法,可以直接将二进制字符串(通过指定基数2)转换为十进制整数。
- 将输入的二进制字符串转化为十进制整数。Python 提供了内置的
-
整数加法运算:
- 转换后的十进制整数直接相加,利用 Python 的任意大数支持,可以安全处理非常大的二进制数的加法。
-
结果转字符串:
-
题目要求返回十进制和的字符串形式,因此将结果用
str()转换为字符串。、
算法实现
以下是完整的算法实现步骤:
-
函数设计:输入:两个二进制字符串。输出:二进制字符串的十进制和(字符串形式)。
-
异常处理:检查输入是否为有效的二进制字符串(即仅包含
0和1)。如果输入无效,返回错误提示信息。 -
转化与计算:使用
int(binary, 2)将二进制字符串转为十进制。对两个十进制整数求和。 -
返回结果:使用
str()将计算结果转为字符串形式。
完整代码实现
python复制代码def solution(binary1, binary2):
try:
# 转换二进制为十进制整数
decimal1 = int(binary1, 2)
decimal2 = int(binary2, 2)
# 求和
decimal_sum = decimal1 + decimal2
# 返回十进制结果的字符串形式
return str(decimal_sum)
except ValueError:
# 如果输入无效,返回提示
return "Invalid binary input"
if __name__ == "__main__":
# 测试用例
print(solution("101", "110")) # 输出: "11"
print(solution("111111", "10100")) # 输出: "83"
print(solution("111010101001001011", "100010101001")) # 输出: "242420"
print(solution("111010101001011", "10010101001")) # 输出: "31220"
print(solution("11", "1")) # 输出: "4"
# 测试无效输入
print(solution("10102", "110")) # 输出: "Invalid binary input"
算法详解
1. 二进制字符串转十进制
-
Python 提供了
int()函数支持多进制到十进制的转换:python复制代码int("101", 2) # 将二进制字符串 '101' 转换为十进制整数 5 -
通过将
binary1和binary2分别转换为十进制整数,可以方便地对它们进行加法操作。
2. 十进制整数加法
-
转换后的十进制整数直接进行加法运算:
python复制代码decimal_sum = decimal1 + decimal2 -
Python 的整数类型支持任意精度,因此即使输入的二进制字符串非常长,也不会有溢出问题。
3. 转换结果为字符串
-
为了符合题目要求,将计算结果(十进制整数)转为字符串形式:
python复制代码return str(decimal_sum)
4. 输入验证
-
如果输入的二进制字符串包含非法字符(如非
0或1的字符),会引发ValueError异常。我们在代码中捕获该异常并返回错误提示信息:python复制代码try: decimal1 = int(binary1, 2) except ValueError: return "Invalid binary input"