问题描述
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)
的前提下,返回两个二进制字符串的十进制求和结果。
代码详解
def solution(binary1, binary2):
# 反转字符串,以便从最低位开始加法
binary1 = binary1[::-1]
binary2 = binary2[::-1]
max_length = max(len(binary1), len(binary2))
carry = 0
result = []
for i in range(max_length):
bit1 = int(binary1[i]) if i < len(binary1) else 0
bit2 = int(binary2[i]) if i < len(binary2) else 0
# 进行二进制加法
total = bit1 + bit2 + carry
result_bit = total % 2 # 当前位
carry = total // 2 # 进位
result.append(str(result_bit))
# 如果还有进位,添加到结果中
if carry:
result.append(str(carry))
# 反转结果列表并连接为字符串
binary_result = ''.join(result[::-1])
# 将二进制结果转换为十进制
decimal_result = str(int(binary_result, 2))
return decimal_result
测试用例
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'
测试样例
样例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'
知识总结
-
字符串操作:
- 使用 Python 的字符串切片功能 (
[::-1]
) 来反转字符串。这种操作常用于处理从低位到高位的加法,因为二进制数是从右到左表示的。
- 使用 Python 的字符串切片功能 (
-
二进制加法:
- 通过逐位相加实现二进制加法。在加法过程中,需要考虑进位(carry),这是二进制加法的一个重要特性。
- 每一位的加法可以通过
total % 2
来获得当前位的结果,而进位则通过total // 2
来计算。
-
列表使用:
- 使用列表
result
来存储每一位的计算结果。列表在 Python 中是一种灵活的数据结构,适用于动态增加元素的场景。
- 使用列表
-
条件表达式:
- 使用条件表达式来处理两个二进制字符串长度不等的情况,确保在索引超出范围时默认使用
0
。
- 使用条件表达式来处理两个二进制字符串长度不等的情况,确保在索引超出范围时默认使用
-
数值进制转换:
- 使用
int(binary_result, 2)
将二进制字符串转换为十进制数。int
函数的第二个参数指定了输入字符串的进制。
- 使用
-
函数设计:
- 将整个逻辑封装在一个函数
solution
中,使得代码更具模块性和可重用性。
- 将整个逻辑封装在一个函数
-
测试用例:
- 在
if __name__ == "__main__":
块中编写测试用例来验证函数的正确性。这是 Python 中常见的用法,用于确保代码在被直接运行时执行测试,而在被导入时不执行测试。
- 在
-
运算符的使用:
- 运用了 Python 的算术运算符(如
+
,%
,//
)来进行加法和求模操作。
- 运用了 Python 的算术运算符(如
这些知识点相互结合,形成了一个完整的二进制加法实现,并展示了如何处理和转换不同进制的数。
制定刷题计划
-
明确学习目标:
- 设定短期和长期目标:例如,短期目标可以是每天刷 3 道题,长期目标是掌握特定主题或通过某个考试。
- 量化目标:明确你打算在特定时间内完成的题目数量,比如每周完成 20 道题。
-
选择合适的题目:
- 基础知识:从基础题目开始,确保理解基本概念和算法。
- 分类刷题:根据数据结构和算法的不同类型(如数组、链表、树、图等)制定刷题计划,确保全面覆盖。
-
时间管理:
- 制定时间表:每天或每周固定时间进行刷题,形成习惯。
- 设定时间限制:每道题目设定一个解题时间,增强解决问题的效率。
-
定期评估:
- 每周复盘:总结每周的学习成果,统计完成的题目和掌握的知识点,调整下周的学习计划。
利用错题进行针对性学习
-
记录错题:
- 建立错题本:将所有做错的题目记录下来,标注错误原因,形成错题集。
- 分类整理:根据知识点或题型分类整理错题,便于后续针对性复习。
-
分析错题:
- 找出共性:分析错误的原因,是否是因为理解不清、粗心大意还是知识点掌握不牢。
- 总结经验:针对错题,总结出解题思路和常见陷阱,形成自己的解题技巧。
-
定期回顾错题:
- 循环复习:设置周期性复习错题的计划,比如每周复习一次错题,确保错误不再重复。
- 再做错题:在适当的时间再次尝试解决之前的错题,以检测自己的进步。
工具运用和资源结合
-
结合 AI 刷题功能:
- 智能推荐:利用 MarsCode AI 的智能推荐功能,依据自己的学习进度和错题记录,系统性地推荐适合的题目。
- 实时反馈:通过 AI 提供的实时反馈和解题思路,帮助自己更快理解问题。
-
与其他学习资源结合:
- 视频教程:在刷题的同时,结合相关的教学视频(如 YouTube 或 MOOC),帮助理解复杂的算法和数据结构。
- 书籍和文档:参考经典教材或文档(如《算法导论》、《LeetCode》等),加深对题目背后知识点的理解。
- 讨论平台:加入编程社区(如 LeetCode 讨论区、Stack Overflow 等),与其他学习者讨论难题,获取不同的解题思路。
-
实战应用:
- 参与竞赛:参加编程竞赛(如 ACM、Codeforces 等),提升实战能力和时间管理技巧。
- 项目实践:将学到的算法应用到实际项目中,增强对知识的理解和运用能力。