“二进制之和”问题详解及学习方法与心得| 豆包MarsCode AI刷题

9 阅读6分钟

问题描述

小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'

知识总结

  1. 字符串操作

    • 使用 Python 的字符串切片功能 ([::-1]) 来反转字符串。这种操作常用于处理从低位到高位的加法,因为二进制数是从右到左表示的。
  2. 二进制加法

    • 通过逐位相加实现二进制加法。在加法过程中,需要考虑进位(carry),这是二进制加法的一个重要特性。
    • 每一位的加法可以通过 total % 2 来获得当前位的结果,而进位则通过 total // 2 来计算。
  3. 列表使用

    • 使用列表 result 来存储每一位的计算结果。列表在 Python 中是一种灵活的数据结构,适用于动态增加元素的场景。
  4. 条件表达式

    • 使用条件表达式来处理两个二进制字符串长度不等的情况,确保在索引超出范围时默认使用 0
  5. 数值进制转换

    • 使用 int(binary_result, 2) 将二进制字符串转换为十进制数。int 函数的第二个参数指定了输入字符串的进制。
  6. 函数设计

    • 将整个逻辑封装在一个函数 solution 中,使得代码更具模块性和可重用性。
  7. 测试用例

    • 在 if __name__ == "__main__": 块中编写测试用例来验证函数的正确性。这是 Python 中常见的用法,用于确保代码在被直接运行时执行测试,而在被导入时不执行测试。
  8. 运算符的使用

    • 运用了 Python 的算术运算符(如 +%//)来进行加法和求模操作。

这些知识点相互结合,形成了一个完整的二进制加法实现,并展示了如何处理和转换不同进制的数。

制定刷题计划

  1. 明确学习目标

    • 设定短期和长期目标:例如,短期目标可以是每天刷 3 道题,长期目标是掌握特定主题或通过某个考试。
    • 量化目标:明确你打算在特定时间内完成的题目数量,比如每周完成 20 道题。
  2. 选择合适的题目

    • 基础知识:从基础题目开始,确保理解基本概念和算法。
    • 分类刷题:根据数据结构和算法的不同类型(如数组、链表、树、图等)制定刷题计划,确保全面覆盖。
  3. 时间管理

    • 制定时间表:每天或每周固定时间进行刷题,形成习惯。
    • 设定时间限制:每道题目设定一个解题时间,增强解决问题的效率。
  4. 定期评估

    • 每周复盘:总结每周的学习成果,统计完成的题目和掌握的知识点,调整下周的学习计划。

利用错题进行针对性学习

  1. 记录错题

    • 建立错题本:将所有做错的题目记录下来,标注错误原因,形成错题集。
    • 分类整理:根据知识点或题型分类整理错题,便于后续针对性复习。
  2. 分析错题

    • 找出共性:分析错误的原因,是否是因为理解不清、粗心大意还是知识点掌握不牢。
    • 总结经验:针对错题,总结出解题思路和常见陷阱,形成自己的解题技巧。
  3. 定期回顾错题

    • 循环复习:设置周期性复习错题的计划,比如每周复习一次错题,确保错误不再重复。
    • 再做错题:在适当的时间再次尝试解决之前的错题,以检测自己的进步。

工具运用和资源结合

  1. 结合 AI 刷题功能

    • 智能推荐:利用 MarsCode AI 的智能推荐功能,依据自己的学习进度和错题记录,系统性地推荐适合的题目。
    • 实时反馈:通过 AI 提供的实时反馈和解题思路,帮助自己更快理解问题。
  2. 与其他学习资源结合

    • 视频教程:在刷题的同时,结合相关的教学视频(如 YouTube 或 MOOC),帮助理解复杂的算法和数据结构。
    • 书籍和文档:参考经典教材或文档(如《算法导论》、《LeetCode》等),加深对题目背后知识点的理解。
    • 讨论平台:加入编程社区(如 LeetCode 讨论区、Stack Overflow 等),与其他学习者讨论难题,获取不同的解题思路。
  3. 实战应用

    • 参与竞赛:参加编程竞赛(如 ACM、Codeforces 等),提升实战能力和时间管理技巧。
    • 项目实践:将学到的算法应用到实际项目中,增强对知识的理解和运用能力。