找单独的数|豆包MarsCode AI

63 阅读2分钟

算法解析

异或运算的特点

  • a ^ a = 0:同样的数进行异或,结果为 0。
  • a ^ 0 = a:任何数与 0 异或,结果是其本身。
  • 异或运算满足交换律和结合律:即 a ^ b ^ c = c ^ a ^ b

因此,假设给定的数组中有多个数字,其中只有一个数字出现了一次,其他数字都出现了两次。我们可以对数组中的所有数字进行异或操作。因为其他数字都出现两次,它们异或之后都会得到 0,最终结果只剩下那个出现一次的数字。

解决步骤

  1. 初始化一个变量 result 为 0。
  2. 遍历数组中的每一个数字,对 result 进行异或操作。
  3. 最终,result 的值即为那个只出现一次的数字。

时间复杂度分析

  • 时间复杂度:O(n),因为我们只需要遍历一次数组。
  • 空间复杂度:O(1),只用了一个额外的变量来存储结果。

代码实现

pythonCopy Code
def findUniqueNumber(nums):
    result = 0
    for num in nums:
        result ^= num  # 将所有数字异或
    return result

解释

  1. result = 0:初始化一个变量 result,初始值为 0。
  2. for num in nums::遍历数组中的每个数字。
  3. result ^= num:将 result 和当前的数字进行异或。由于异或的性质,重复出现的数字会相互抵消,最终只剩下那个出现一次的数字。
  4. 最后,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) 时间复杂度内找到唯一出现一次的数字,并且只使用了常数级的额外空间。这种方法非常高效,并且充分利用了位运算的性质。