在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
题目分析: 这道题的核心是寻找一个唯一存在的数字,其余数字均成对出现。要求在 O(n)O(n) 时间复杂度内完成,同时尽量减少额外空间的使用。由于数字成对出现具有消除性,因此可以利用异或操作的性质来解决问题。这种方法非常高效,因为异或操作本身满足交换律和结合律,且能够在单次遍历中直接定位唯一的数字。 思路: 采用异或XOR,对所有数字进行异或操作,成对的数字异或后会归零,剩下的就是那个独特的数字, 首先初始化一个变量unique_number,然后遍历数组中的每一个数字并将其与该变量进行异或,遍历结束后剩下的一个数就是unique_number。 思路分析
-
异或操作的性质:
- x⊕x=0:相同的数字异或后会消失。
- x⊕0=x:任意数字与 0 异或,结果为其本身。
- 异或满足交换律和结合律,即 a⊕b⊕c=a⊕c⊕b,顺序无关。
-
算法思想:
- 初始化一个变量 unique_numberunique_number,值为 0。
- 遍历整个数组,对于每个数字 xx,将其与 unique_numberunique_number 进行异或操作。
- 在遍历结束后,所有成对的数字因异或操作变为 0,仅剩下唯一的数字作为结果。
-
优化目标:
- 时间复杂度为 O(n)O(n):只需一次遍历即可完成。
- 空间复杂度为 O(1)O(1):不需要额外存储其他数据结构(如哈希表或数组),仅需一个辅助变量。 算法步骤
-
初始化一个变量 unique_number=0。
-
遍历数组中的每个数字 x:
- 将 x 与 unique_numberunique_number 进行异或操作。
- 更新 unique_numberunique_number 的值。
-
遍历结束后,unique_numberunique_number 即为那个唯一的数字。
-
返回结果。 优化与对比
相比于其他可能的解法(如使用哈希表统计频次):
时间效率: 哈希表方法的时间复杂度为 O(n)O(n),但由于涉及哈希运算,实际效率可能稍低。 异或方法直接通过位运算解决问题,速度更快。
空间效率:
哈希表方法需要额外的存储空间,空间复杂度为 O(n)O(n)。 异或方法无需额外存储,空间复杂度为 O(1)O(1)。