题目解析
题目分析
这个题目要求我们设计一个算法,能够将两个二进制字符串相加并返回它们的十进制和。关键点在于:
输入是两个非常长的二进制字符串,可能超出了普通整型变量的范围。 我们需要处理这些大数并在不超过 ( O(n^2) ) 的时间复杂度下完成求和。
解题思路
直接二进制加法
-
我们可以模拟二进制加法的过程,从最低位(即二进制字符串的末尾)开始逐位加。
-
每一位的加法结果包括当前位和进位。这个过程类似于传统的竖式加法。
-
加法过程中需要注意以下几点:
需要从右到左依次处理每一位,并维护一个进位值。
如果两个位相加超过了1(即产生了进位),我们就把进位加到下一位。
方法实现
- 对齐两者长度:首先如果两个二进制字符串长度不同,可以通过在较短的字符串前面补 0 来进行对齐。
- 逐位加法:从右到左逐位加,同时记录进位。
- 进位处理:如果当前位的和大于1(即产生了进位),则进位值为1,当前位为 和 - 2。
二进制转化为十进制
- 二进制加法完成后,我们得到一个新的二进制字符串。我们需要将这个二进制字符串转换为十进制。
- 这个转换可以通过将二进制字符串从左到右逐位加权求和实现。
知识总结
通过模拟二进制加法的过程,并处理进位,我们能够在 ( O(n) ) 时间复杂度内完成两二进制字符串的加法,并返回结果的十进制表示。这个方法不仅高效,而且能够处理任意长的二进制字符串。
学习计划
- 分阶段学习:将大的目标拆分为多个小的阶段,每个阶段有清晰的任务。
- 基础阶段:从简单题开始,打牢基础。
- 进阶阶段:解决中等难度的题目,强化算法设计和数据结构的掌握。
- 实战阶段:通过模拟面试题目,提升解决问题的速度和准确性。
工具运用
- MarsCode AI 可以根据学习进度和水平智能推荐适合的题目,可以避免过多浪费时间选择题目,减少选择障碍。
- 将题目分为初级、中级、难度高的几类,逐步挑战自己的极限。MarsCode AI 会根据每个题目的难度,合理安排刷题顺序。
# 对齐长度,补零
max_len = max(len(bin1), len(bin2))
bin1 = bin1.zfill(max_len)
bin2 = bin2.zfill(max_len)
carry = 0 # 进位
result = [] # 存储加法结果
# 从右到左逐位加
for i in range(max_len - 1, -1, -1):
bit1 = int(bin1[i]) # 获取当前位的值
bit2 = int(bin2[i]) # 获取当前位的值
total = bit1 + bit2 + carry # 当前位的总和
result.append(str(total % 2)) # 当前位的值 (0或1)
carry = total // 2 # 更新进位
if carry: # 如果最终还有进位
result.append('1')
# 结果是倒序的,需要反转
result.reverse()
# 将结果的二进制转换为十进制
decimal_result = int(''.join(result), 2)
# 将十进制结果转换为字符串形式
return str(decimal_result)
# 测试示例
bin1 = "101"
bin2 = "111"
print(addBinary(bin1, bin2)) # 输出 "12"