算法解析
异或运算的特点
a ^ a = 0:同样的数进行异或,结果为 0。a ^ 0 = a:任何数与 0 异或,结果是其本身。- 异或运算满足交换律和结合律:即
a ^ b ^ c = c ^ a ^ b。
因此,假设给定的数组中有多个数字,其中只有一个数字出现了一次,其他数字都出现了两次。我们可以对数组中的所有数字进行异或操作。因为其他数字都出现两次,它们异或之后都会得到 0,最终结果只剩下那个出现一次的数字。
解决步骤
- 初始化一个变量
result为 0。 - 遍历数组中的每一个数字,对
result进行异或操作。 - 最终,
result的值即为那个只出现一次的数字。
时间复杂度分析
- 时间复杂度:O(n),因为我们只需要遍历一次数组。
- 空间复杂度:O(1),只用了一个额外的变量来存储结果。
代码实现
pythonCopy Code
def findUniqueNumber(nums):
result = 0
for num in nums:
result ^= num # 将所有数字异或
return result
解释
result = 0:初始化一个变量result,初始值为 0。for num in nums::遍历数组中的每个数字。result ^= num:将result和当前的数字进行异或。由于异或的性质,重复出现的数字会相互抵消,最终只剩下那个出现一次的数字。- 最后,
result就是那个只出现一次的数字。
示例
假设输入数组是 [4, 3, 2, 7, 8, 2, 3, 4, 7]。
- 初始时,
result = 0。 - 第一次异或:
result = 0 ^ 4 = 4 - 第二次异或:
result = 4 ^ 3 = 7 - 第三次异或:
result = 7 ^ 2 = 5 - 第四次异或:
result = 5 ^ 7 = 2 - 第五次异或:
result = 2 ^ 8 = 10 - 第六次异或:
result = 10 ^ 2 = 8 - 第七次异或:
result = 8 ^ 3 = 11 - 第八次异或:
result = 11 ^ 4 = 15 - 第九次异或:
result = 15 ^ 7 = 8
最后,result 的值为 8,这是那个只出现一次的数字。
总结
通过使用异或运算,我们能够在 O(n) 时间复杂度内找到唯一出现一次的数字,并且只使用了常数级的额外空间。这种方法非常高效,并且充分利用了位运算的性质。