问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
1.设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
2.尽量减少额外空间的使用,以体现你的算法优化能力。
代码实现
def solution(inp):
unique_num = 0
for num in inp:
unique_num ^= num
return unique_num
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)
一、题目解析
本题属于经典的位运算问题,核心是利用异或运算的性质来找出数组中唯一不重复的数字。题目要求算法的时间复杂度为 ,并尽量减少额外的空间使用。具体思路如下:
1、异或运算的性质
- 自反性:任何数与自己异或结果为 0。
- 与 0 异或:任何数与 0 异或结果为它本身。
- 交换律和结合律:异或运算满足交换律和结合律。
基于上述性质,如果一个数组中,除了一个数字外其他数字都出现两次,那么将所有数字进行异或运算,成对的数字会抵消为 0,最后剩下的就是那个唯一的数字。
2、解题步骤
- 初始化一个变量 unique_num 为 0。
- 遍历数组中的每个数字,将它与 unique_num 进行异或运算。
- 遍历结束后,unique_num 就是唯一的数字。
3、示例分析
以输入 cards = [1, 1, 2, 2, 3, 3, 4, 5, 5] 为例:
-
初始状态:unique_num = 0
-
异或过程:
0 ^ 1 = 1
1 ^ 1 = 0
0 ^ 2 = 2
2 ^ 2 = 0
0 ^ 3 = 3
3 ^ 3 = 0
0 ^ 4 = 4
4 ^ 5 = 1
1 ^ 5 = 4
最后,unique_num = 4,即为唯一的数字。
二、知识总结
- 异或运算的高效性:异或运算可以在 时间内解决寻找唯一数字的问题,并且不需要额外的空间存储临时变量,算法简单高效。
- 数组遍历与操作结合:本题展示了如何在一次遍历中完成计算,体现了对时间复杂度和空间复杂度的优化。
- 数学性质在编程中的应用:异或运算本质上是数学的逻辑操作,将其与数组特性结合使用,可以解决许多类似问题(例如:判断数组中是否有重复数字)。
三、学习建议
对于入门学习者,可以从了解异或的基础性质入手,然后尝试用它解决一些简单问题,例如翻转比特位或查找单个数字。
四、总结建议
将 AI 工具与个人学习计划结合,逐步提升编程能力,既能提高刷题效率,又能夯实基础知识。