题目:在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求: 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。 def solution(cards): # 初始化结果变量为0 result = 0
# 遍历数组中的每一个元素
for card in cards:
# 对每一个元素进行异或操作
result ^= card
# 返回最终结果
return result
if name == "main": # 测试用例 print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4) print(solution([0, 1, 0, 1, 2]) == 2) print(solution([7, 3, 3, 7, 10]) == 10)
思路**:
利用异或运算的特性来解决此问题。异或运算(^)有两个关键性质,一是任何数与自身异或结果为 0(即 a ^ a = 0),二是任何数与 0 异或结果为其本身(即 a ^ 0 = a)。在给定的班级同学卡片数字数组中,除了那个只出现一次的独特数字外,其他数字都恰好出现两次。那么当我们对整个数组中的所有数字依次进行异或操作时,成对出现的数字经过异或都会变为 0,最终剩下的就是那个只出现一次的独特数字。例如,对于数组 [1, 1, 2, 2, 3],先 1 ^ 1 = 0,2 ^ 2 = 0,然后 0 ^ 0 ^ 3 = 3,就得到了独特数字 3。
从代码角度看,首先初始化一个变量 result 为 0,然后通过循环遍历数组 cards 中的每一个元素 card,将 result 与 card 进行异或操作(result ^= card),循环结束后,result 中存储的就是那个独特数字,最后返回 result。
- 初始化
result为 0:这是为了确保在开始异或操作时,result不会影响最终结果。 - 遍历数组:使用
for循环遍历数组中的每一个元素。 - 异或操作:对每一个元素进行异或操作,
result ^= card。 - 返回结果:最终
result中剩下的就是唯一的独特数字。
知识总结
-
新知识点梳理:
-
异或运算特性的深入理解:之前可能只是简单知道异或运算的基本规则,但通过这个题目,深刻体会到了像
a ^ a = 0和a ^ 0 = a这样特性在实际算法中的巧妙应用,可以快速解决一些查找独特元素的问题。 -
时间复杂度和空间复杂度分析在实际代码中的体现:代码中只需要遍历一遍数组就能得到结果,所以时间复杂度是 (
n为数组元素个数也就是班级人数),并且只使用了一个额外变量result来存储中间和最终结果,空间复杂度为 ,很好地满足了题目要求,也进一步理解了如何在编写代码时去衡量和优化复杂度。 -
学习计划
-
-
制定刷题计划:
- 分类刷题:可以按照算法类型或者数据结构相关主题来划分,比如先集中刷数组相关的题目,因为数组是最基础的数据结构,很多算法都会涉及。在刷数组题目时,又可以细分,像本题这种查找特定元素的归为一类,数组排序相关的归为一类等,每个小类安排一定的时间和题量去练习,例如每天花 1 - 2 小时刷 3 - 5 道同一小类的题目,逐步掌握各类题型的解法。
- 难度递进:从简单题目开始,逐渐过渡到中等难度、高难度题目。简单题目可以帮助熟悉基本概念和常见解法思路,建立信心;中等难度题目则是巩固和拓展知识应用能力;高难度题目用来挑战自己,提升对知识的深入理解和灵活运用能力。比如刚开始一周都刷简单的数组查找类题目,熟练后再进入中等难度的,以此类推。
-
利用错题进行针对性学习:
- 错题整理:把做错的题目整理到专门的错题本或者电子文档中,记录下题目内容、自己当时的错误解法以及错误原因分析,比如是对知识点理解错误、解题思路不对还是代码实现细节有误等。
- 针对性强化:根据错误原因进行有针对性的复习和练习。如果是知识点理解错误,就重新学习相关知识,找一些基础的讲解资料或者向他人请教,把知识点弄明白后再做几道类似的基础题目巩固;如果是解题思路问题,仔细研究正确答案的思路,分析自己为什么没想到,然后找同类型的题目按照正确思路去练习,直到熟练掌握这种思路;若是代码实现细节出错,就仔细对照正确代码检查自己的代码,找出问题所在,比如变量初始化错误、循环条件设置不当等,以后写代码时要格外注意这些容易出错的点。
工具运用
- 与在线编程平台结合:可以使用 LeetCode、牛客网等在线编程平台,这些平台上有海量的算法题目,而且有详细的题目分类和难度标注,方便制定刷题计划。在平台上提交代码后,能看到代码的运行结果、时间复杂度和空间复杂度情况,还能查看别人的解题思路和代码示例,通过对比自己的代码,学习别人的优秀之处,不断优化自己的解法。比如做完本题后,可以在平台上搜索其他类似利用位运算查找独特元素的题目继续练习,也可以参考其他用户对于本题的不同实现方式,拓宽思路。
- 搭配学习资料和论坛:除了 AI 刷题功能,还可以结合经典的算法书籍,如《算法导论》《数据结构与算法分析》等,书中有系统全面的知识讲解和丰富的案例,可以帮助深入理解算法原理和背后的数学逻辑。同时,参与一些技术论坛,如知乎、Stack Overflow 等相关算法板块,遇到问题可以在上面提问,也可以浏览别人的问答,了解一些常见的算法学习难点和解决方法,把从 AI 刷题中学到的知识与这些资料、论坛上的内容相互印证、补充,从而达到更好的学习效果。