如何在JavaScript数组中移除指定数量重复值并保留剩余元素?
从含重复元素的5元数组中提取剩余两个数字
问题描述
我有一个包含5个数字的数组,其中某个数字出现3次或更多,例如数组[1,1,4,2,1]。需要从中提取出剩下的两个数字(示例结果为[4,2])。以下是测试用例:
[1,1,4,2,1]=>[4,2]或[2,4][5,5,1,5,5]=>[1,5]或[5,1][3,4,3,4,3]=>[4,4][6,6,6,6,6]=>[6,6]
我的尝试
我尝试通过统计数字出现次数来解决,已取得部分进展,但不知后续如何处理,我的代码如下:
function getUniques(arr) { const counts = {}; arr.forEach(num => {counts[num] = (counts[num]||0) + 1}); const uniques = []; Object.keys(counts).forEach(n => { if (counts[n] === 1) uniques.push(Number(n)); }); return uniques; } console.log(getUniques([1,4,2,1,1])) // [2,4] console.log(getUniques([6,3,3,6,6])) // [] console.log(getUniques([5,3,5,5,5])) // [3] console.log(getUniques([4,4,4,4,4])) // []
解决方案
你的思路方向是对的,问题在于只处理了出现1次的元素,没覆盖主元素出现4次、5次,以及其他元素出现2次的情况。可以通过以下步骤完善:
- 统计每个数字的出现次数;
- 定位出现次数≥3的主元素(题目保证唯一存在);
- 先收集所有非主元素,再补充主元素直到结果数组长度为2。
修改后的代码如下:
function getRemainingTwo(arr) { // 统计每个数字的出现次数 const counts = {}; arr.forEach(num => { counts[num] = (counts[num] || 0) + 1; }); // 找到出现次数≥3的主元素 const mainNum = +Object.keys(counts).find(key => counts[key] >= 3); // 收集所有非主元素 const result = arr.filter(num => num !== mainNum); // 补充主元素,确保结果长度为2 while (result.length < 2) { result.push(mainNum); } return result; } // 测试验证 console.log(getRemainingTwo([1,1,4,2,1])) // [4,2] console.log(getRemainingTwo([5,5,1,5,5])) // [1,5] console.log(getRemainingTwo([3,4,3,4,3])) // [4,4] console.log(getRemainingTwo([6,6,6,6,6])) // [6,6]
代码说明
- 统计次数部分和你的代码逻辑一致;
- 利用
find方法快速定位主元素,因为数组总长度为5,不可能存在两个元素出现次数都≥3; - 用
filter收集所有非主元素,再通过循环补充主元素,刚好满足所有测试用例的要求; - 结果数组的顺序和原数组中非主元素的顺序一致,符合测试用例允许的顺序要求。
内容的提问来源于stack exchange,提问作者absolutely not the the
相关产品推荐
相关产品推荐

