1.找单独的数
问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小 C 快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
在计算机科学中,"找单独的数"问题通常指的是在一个数组中找到一个只出现一次的数字,其他数字都是成对出现的(即出现两次)。例如,在数组 [2, 2, 1, 4, 4, 5, 1] 中,数字 5 是唯一只出现一次的数字。
思路分析
使用集合(Set):我们可以使用 JavaScript 中的 Set 结构来记录出现的数字。如果出现过的数字再次出现,则将它从 Set 中删除,最后 Set 中剩下的就是那个单独的数。
位运算(XOR):我们可以利用 XOR 操作的性质来求解。XOR 的性质是:相同的数字进行 XOR 运算会得到 0,任何数字与 0 进行 XOR 运算会得到它本身。因此,当我们将所有数进行 XOR 运算,最终会得到那个只出现一次的数字。
遍历数组并统计次数:我们可以使用一个对象来记录每个数字出现的次数,然后遍历这个对象,找到计数为 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))
代码解析
- 初始化一个变量
result为 0。 - 遍历数组
nums,对每个数字num进行 XOR 运算,并将结果存储在result中。 - 返回
result,即为只出现一次的数字。
总结
通过本篇文章,我们实现了一个简单又高效的算法来寻找数组中的唯一数字。使用位运算的性质,能够在 O(n) 的时间复杂度和 O(1) 的空间复杂度下解决问题。这种方法比使用集合或计数对象更具优势,