Ruby如何移除数组中所有重复出现的元素?
最优实现方案:统计频率后筛选
好问题!要实现移除数组中所有重复元素(仅保留出现次数恰好为1的元素),最优的方式是先统计每个元素的出现频率,再基于频率筛选结果。这种方法的时间复杂度为O(n)(仅需两次线性遍历),空间复杂度为O(k)(k为数组中不同元素的数量),是效率最高的方案之一。
JavaScript 实现
const arr = [1, 1, 2, 3, 4, 4, 5]; // 第一步:用 reduce 统计每个元素的出现次数 const frequencyMap = arr.reduce((acc, num) => { acc[num] = (acc[num] || 0) + 1; return acc; }, {}); // 第二步:筛选出仅出现一次的元素 const uniqueOnly = arr.filter(num => frequencyMap[num] === 1); console.log(uniqueOnly); // 输出: [2, 3, 5]
Python 实现
如果你用Python,可以借助内置的Counter工具类简化统计过程:
from collections import Counter arr = [1, 1, 2, 3, 4, 4, 5] frequency = Counter(arr) unique_only = [num for num in arr if frequency[num] == 1] print(unique_only) # 输出: [2, 3, 5]
为什么这是最优解?
- 时间效率:两次线性遍历(统计+筛选),总时间复杂度O(n),远优于嵌套循环的O(n²)方案。
- 空间效率:仅需存储不同元素的频率,对于大多数场景来说空间开销完全可控。
不推荐的方案(仅作对比)
如果你尝试用嵌套循环逐个检查元素是否重复,虽然不需要额外空间,但时间复杂度会飙升到O(n²),仅适合极小规模的数组:
const arr = [1, 1, 2, 3, 4, 4, 5]; const uniqueOnly = []; for (let i = 0; i < arr.length; i++) { let isUnique = true; for (let j = 0; j < arr.length; j++) { if (i !== j && arr[i] === arr[j]) { isUnique = false; break; } } if (isUnique) uniqueOnly.push(arr[i]); } console.log(uniqueOnly); // 输出: [2, 3, 5]
内容的提问来源于stack exchange,提问作者endex
相关产品推荐
相关产品推荐

