青训营X豆包MarsCode 技术训练营|找单独数问题解析与学习总结| 豆包MarsCode AI 刷题

52 阅读6分钟

题目解析

  • 思路

    • 本题要求在一个整数数组中找到那个只出现一次的数字,其他数字都恰好出现两次。利用异或运算的特性可以巧妙地解决这个问题。异或运算(^)有以下几个重要性质:

      • 任何数与 0 进行异或运算,结果都是该数本身,即 a ^ 0 = a。
      • 相同的两个数进行异或运算,结果为 0,即 a ^ a = 0。
    • 在给定的数组中,当我们对所有元素依次进行异或运算时,那些出现两次的数字经过两次异或运算后会相互抵消,最终剩下的就是只出现一次的那个数字。

  • 图解:假设数组为 [1, 1, 2, 2, 3, 3, 4],下面用简单的步骤展示异或运算过程:

    • 初始化结果 result 为 0。
    • 第一步:result ^= 1,此时 result 为 1(因为 0 ^ 1 = 1)。
    • 第二步:result ^= 1,此时 result 为 0(因为 1 ^ 1 = 0)。
    • 第三步:result ^= 2,此时 result 为 2(因为 0 ^ 2 = 2)。
    • 第四步:result ^= 2,此时 result 为 0(因为 2 ^ 2 = 0)。
    • 第五步:result ^= 3,此时 result 为 3(因为 0 ^ 3 = 3)。
    • 第六步:result ^= 3,此时 result 为 0(因为 3 ^ 3 = 0)。
    • 第七步:result ^= 4,此时 result 为 4(因为 0 ^ 4 = 4)。
    • 最终 result 的值就是只出现一次的数字 4。
  • 代码详解

    • 在 solution 函数中:

      • 首先初始化 result 为 0,这是利用了异或运算中任何数与 0 异或结果为该数本身的性质。
      • 然后通过循环遍历数组 cards 中的每一个元素 card,在每次循环中,将 result 与当前元素 card 进行异或运算(result ^= card)。这样,经过整个数组的遍历,那些出现两次的元素会相互抵消,最终 result 就会得到只出现一次的那个数字。
      • 最后返回 result
    • 在 __main__ 部分:

      • 给出了两个测试用例,分别是 [1, 1, 2, 2, 3, 3, 4, 5, 5] 和 [0, 1, 0, 1, 2],通过打印比较函数返回值与预期结果是否相等来验证函数的正确性。

知识总结

  • 新知识点

    • 异或运算的特性及应用:了解到异或运算在处理一些特定的数组元素查找问题上有独特的优势,特别是当需要找出数组中只出现一次的元素,而其他元素都成对出现时,可以利用异或运算快速解决。
  • 理解:异或运算的性质使得它在这种情境下就像是一个 “过滤器”,能够自动过滤掉那些成对出现的元素,只留下我们想要找的那个独特元素。它巧妙地利用了相同元素异或为 0,以及任何数与 0 异或为该数本身的特点。

  • 学习建议

    • 对于入门同学,首先要深入理解异或运算的基本性质,可以通过手动计算一些简单的异或运算例子来加深印象,比如计算不同整数之间的异或结果,观察规律。
    • 在遇到类似的数组元素查找问题时,要尝试联想是否可以运用异或运算来解决,多做一些相关的练习题,培养这种思维模式。

学习计划

  • 制定刷题计划

    • 确定目标:明确自己想要提升的技能或知识点,比如本题涉及的算法优化和异或运算应用,就可以将掌握更多利用运算特性解决数组问题的算法作为目标。
    • 分类刷题:将题目按照知识点或题型进行分类,例如可以把涉及异或运算的题目归为一类,然后根据自己的时间和学习进度,安排每天或每周刷一定数量的该类题目。
    • 循序渐进:从简单到复杂安排刷题顺序,先从那些直接应用异或运算性质的简单题目开始,逐渐过渡到需要结合其他算法或数据结构的复杂题目。
  • 利用错题进行针对性学习

    • 分析错题原因:当遇到错题时,仔细分析是因为对知识点不理解(如异或运算性质不清楚),还是算法思路错误(如没有想到用异或运算解决本题),亦或是代码实现细节有误(如循环条件设置错误)。
    • 针对性复习:根据错题原因进行针对性复习,如果是知识点问题,就重新学习相关知识点并做一些巩固练习题;如果是算法思路问题,就去研究类似题目的正确算法思路,多做几道同类型的题目进行验证;如果是代码实现细节问题,就仔细检查代码,找出错误并改正,同时记住这个错误点,避免下次再犯。

工具运用

  • 结合 AI 刷题功能

    • 利用 AI 进行知识点讲解:当遇到不理解的知识点,比如异或运算的复杂应用时,可以向 AI 提问,让它详细讲解知识点的原理、应用场景等,帮助自己更好地理解。

    • 寻求算法思路提示:在刷题过程中,如果遇到难题,想不出算法思路,可以向 AI 描述题目情况,让它提供一些算法思路提示,拓宽自己的思维。

    • 代码检查与优化:写完代码后,可以让 AI 帮忙检查代码是否有错误,以及是否可以进行优化,提高代码的质量和性能。

    • 结合其他学习资源

      • 参考书籍:配合相关的算法书籍一起学习,比如《算法导论》《数据结构与算法分析》等,书中会有更系统的知识点讲解和更多的例题及练习题,可以加深对知识点的理解和掌握。

      • 在线课程:参加一些在线课程,如 Coursera、EdX 上的算法相关课程,课程中会有老师的详细讲解和互动环节,能更好地跟进学习进度,掌握知识点。

      • 学习社区:加入一些学习社区,如 Stack Overflow、LeetCode 讨论区等,在那里可以和其他学习者交流学习心得、讨论题目解法等,从别人的经验中学习。

通过以上方式,将 AI 刷题功能与其他学习资源相结合,可以更高效地学习算法知识,提升自己的编程能力。

附:

屏幕截图 2024-11-26 111633.png