要解决这个问题,我们可以利用位运算中的异或(XOR)操作。异或操作有一个非常有用的性质:对于任何整数 a,有 a ^ a = 0 和 a ^ 0 = a。这意味着如果一个数字出现了两次,那么这两个相同的数字进行异或操作的结果是0;而一个数字与0进行异或操作,结果还是这个数字本身。
基于这个性质,如果我们对数组中的所有数字进行异或操作,成对出现的数字会相互抵消变为0,最终剩下的就是那个只出现一次的数字。
问题背景
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。我们需要找到那个只出现一次的数字。
解决方案概述
我们可以利用位运算中的异或(XOR)操作来解决这个问题。异或操作有以下两个关键性质:
- 相同数字异或为0:对于任何整数
a,a ^ a = 0。 - 与0异或保持不变:对于任何整数
a,a ^ 0 = a。
基于这些性质,如果我们对数组中的所有数字进行异或操作,那么成对出现的数字会相互抵消变为0,最终剩下的就是那个唯一出现一次的数字。
详细步骤
- 初始化变量:我们定义一个变量
unique并将其设置为0。这个变量将用来存储最终的结果。 - 遍历数组:我们遍历整个数组
cards,对于每个元素card,我们将它与unique进行异或操作,并将结果赋值回unique。 - 返回结果:遍历结束后,
unique就是那个只出现一次的数字。
代码
def solution(cards):
# Edit your code here
unique_number = 0
for num in cards:
unique_number ^=num
return unique_number
这段代码首先定义了一个函数 find_unique_number,它接受一个列表 cards 作为参数。然后,通过遍历列表中的每一个元素,并将其与 unique 变量进行异或操作,最后返回 unique 的值,即为那个只出现一次的数字。
这种方法非常高效,因为它既满足了时间复杂度的要求,又几乎不使用额外的空间。