题目解析:二进制之和
小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. 问题分析
- 输入是两个二进制字符串
binary1和binary2。 - 我们需要按照二进制加法规则(从最低位到最高位)逐位相加,处理进位,直到所有的二进制位都处理完。
- 结果最终是一个二进制字符串,需要将其转换为十进制,并返回其字符串表示。
2. 二进制加法
-
二进制加法的基本规则:
0 + 0 = 0(无进位)0 + 1 = 1或1 + 0 = 1(无进位)1 + 1 = 10(有进位,结果为0,进位为1)1 + 1 + 1 = 11(有进位,结果为1,进位为1)
-
需要从两个二进制字符串的最后一位(最低位)开始逐位相加,计算每一位的和,并处理进位。
3. 具体步骤
-
初始化:
- 用一个列表
s来存储加法结果的每一位,注意这里是反向存储(二进制结果从最低位开始存)。 - 用变量
t来存储进位(初始值为0)。
- 用一个列表
-
逐位相加:
-
从两个字符串的末尾开始逐位相加,处理对应的位。如果一个字符串比另一个长,缺失的位认为是0。
-
每次加法之后,计算当前位的和:
- 如果和为 3 (
1 + 1 + 1),则当前位为 1,进位t设置为 1。 - 如果和为 2 (
1 + 1),则当前位为 0,进位t设置为 1。 - 如果和为 1,当前位为 1,进位
t设置为 0。 - 如果和为 0,当前位为 0,进位
t设置为 0。
- 如果和为 3 (
-
-
处理剩余进位:
- 当所有位都加完后,如果还有进位(
t > 0),则需要将进位 1 加入到结果中。
- 当所有位都加完后,如果还有进位(
-
构造二进制结果:
- 最终的二进制结果存储在
s中,注意s是反向存储的,所以在计算十进制时需要按位置逆序计算其值。
- 最终的二进制结果存储在
-
二进制转换为十进制:
- 将二进制字符串(反向存储的
s)转换为十进制。每个二进制位可以通过2^i来转换为十进制值,其中i是二进制位的索引。
- 将二进制字符串(反向存储的
4. 代码实现
pythonCopy Code
def solution(binary1, binary2):
s = [] # 存储二进制加法的每一位
t = 0 # 进位
# 反向遍历两个二进制字符串
i, j = len(binary1) - 1, len(binary2) - 1
while i >= 0 or j >= 0:
a = int(binary1[i]) if i >= 0 else 0 # 取出binary1当前位的数字
b = int(binary2[j]) if j >= 0 else 0 # 取出binary2当前位的数字
total = a + b + t # 计算当前位的总和
if total == 3:
s.append(1)
t = 1
elif total == 2:
s.append(0)
t = 1
elif total == 1:
s.append(1)
t = 0
else:
s.append(0)
t = 0
i -= 1 # 继续处理前一位
j -= 1 # 继续处理前一位
# 如果还有进位,添加到结果
if t > 0:
s.append(1)
# 将二进制结果转为十进制
ans = 0
for idx in range(len(s)):
ans += s[idx] * (2 ** idx) # 二进制位乘以对应的2的幂次方
return str(ans) # 返回十进制结果的字符串形式
if __name__ == "__main__":
# 你可以添加更多的测试用例
print(solution("101", "110") == "11") # 预期结果 "11"
print(solution("111111", "10100") == "83") # 预期结果 "83"
print(solution("111010101001001011", "100010101001") == "242420") # 预期结果 "242420"
print(solution("111010101001011", "10010101001") == "31220") # 预期结果 "31220"
5. 优化与注意事项
- 处理进位: 在每一轮加法中,我们始终保持
t变量来记录是否有进位,直到所有位加完。 - 长度不一致的情况: 如果两个二进制字符串的长度不一致,较短的字符串会被补充为 0。
- 处理进位的最后一步: 如果循环结束后进位
t仍然大于 0,需要将它添加到结果列表中。 - 二进制到十进制的转换: 由于二进制的位数是从低位到高位存储的,转换为十进制时要按照指数次幂的方式计算。
6. 总结
这个问题通过模拟二进制加法来解决,从最低位开始逐位相加,并处理进位,最后将二进制结果转换为十进制。这个解法避免了直接使用内建的二进制加法功能,展示了如何手动处理二进制加法的每一步。
心得:
使用MarsCode AI编写代码让我体验到了编程的便利与高效。AI能够快速生成代码示例,帮助我理解不同编程概念。通过交互式的反馈,我能迅速调整思路,解决问题。同时,MarsCode AI提供的建议让我了解到更多最佳实践,提升了我的编码水平。这种工具不仅节省了时间,还激发了我的创造力,尤其是在处理复杂问题时,AI的支持显得尤为重要。总的来说,MarsCode AI是编程学习和实践中的得力助手。