Skip to content
On this page

1.找单独的数

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小 C 快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

在计算机科学中,"找单独的数"问题通常指的是在一个数组中找到一个只出现一次的数字,其他数字都是成对出现的(即出现两次)。例如,在数组 [2, 2, 1, 4, 4, 5, 1] 中,数字 5 是唯一只出现一次的数字。

思路分析

  1. 使用集合(Set):我们可以使用 JavaScript 中的 Set 结构来记录出现的数字。如果出现过的数字再次出现,则将它从 Set 中删除,最后 Set 中剩下的就是那个单独的数。

  2. 位运算(XOR):我们可以利用 XOR 操作的性质来求解。XOR 的性质是:相同的数字进行 XOR 运算会得到 0,任何数字与 0 进行 XOR 运算会得到它本身。因此,当我们将所有数进行 XOR 运算,最终会得到那个只出现一次的数字。

  3. 遍历数组并统计次数:我们可以使用一个对象来记录每个数字出现的次数,然后遍历这个对象,找到计数为 1 的数字。

在这里,我们选择使用 XOR 操作的方式,因为它的时间复杂度为 O(n),空间复杂度为 O(1),性能更优。

代码实现

javascript
function findSingleNumber(nums) {
  let result = 0
  for (let num of nums) {
    result ^= num
  }
  return result
}

// 示例
const nums = [2, 2, 1, 4, 4, 5, 1] // 输出 5
console.log(findSingleNumber(nums))

代码解析

  1. 初始化一个变量 result 为 0。
  2. 遍历数组 nums,对每个数字 num 进行 XOR 运算,并将结果存储在 result 中。
  3. 返回 result,即为只出现一次的数字。

总结

通过本篇文章,我们实现了一个简单又高效的算法来寻找数组中的唯一数字。使用位运算的性质,能够在 O(n) 的时间复杂度和 O(1) 的空间复杂度下解决问题。这种方法比使用集合或计数对象更具优势,

上次更新于: