You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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次的情况。可以通过以下步骤完善:

  1. 统计每个数字的出现次数;
  2. 定位出现次数≥3的主元素(题目保证唯一存在);
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:05:13