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

JavaScript如何移除数组中重复次数超过指定值的多余元素

实现数组元素最多保留指定次数重复的方案

方案1:原地双指针法(最优空间性能)

该方案无需额外开辟存储空间,仅在原数组上修改,时间复杂度为O(n),空间复杂度为O(1),适合处理超大体积的数组场景。

function limitDuplicates(arr, maxRepeat) {
  if (maxRepeat < 1) return []
  if (arr.length <= maxRepeat) return arr
  // 慢指针标记下一个可写入的位置
  let slow = maxRepeat
  for (let fast = maxRepeat; fast < arr.length; fast++) {
    // 快指针元素与慢指针前maxRepeat位元素不同,说明未超出重复上限
    if (arr[fast] !== arr[slow - maxRepeat]) {
      arr[slow] = arr[fast]
      slow++
    }
  }
  // 截断数组到有效长度
  arr.length = slow
  return arr
}

// 测试用例
const arr = [1,1,1,3,3,2,4,4,7,7,7,7]
const maxRepeat = 2
console.log(limitDuplicates(arr, maxRepeat)) // 输出:[1,1,3,3,2,4,4,7,7]

方案2:哈希计数法(逻辑最直观)

该方案通过哈希表记录每个元素的出现次数,过滤掉超出次数限制的元素,代码逻辑简单易维护,时间复杂度为O(n),空间复杂度为O(k),k为数组中不同元素的数量,适合无内存限制的常规场景。

function limitDuplicates(arr, maxRepeat) {
  const countMap = new Map()
  return arr.filter(item => {
    const current = countMap.get(item) || 0
    if (current < maxRepeat) {
      countMap.set(item, current + 1)
      return true
    }
    return false
  })
}

// 测试用例
const arr = [1,1,1,3,3,2,4,4,7,7,7,7]
const maxRepeat = 2
console.log(limitDuplicates(arr, maxRepeat)) // 输出:[1,1,3,3,2,4,4,7,7]

注意事项

  • 以上示例均针对元素为基础类型(数字、字符串、布尔值等)的数组实现,如果数组元素为对象等引用类型,需要自行调整相等判断逻辑。
  • 若不需要保留原数组顺序,可先排序再做去重处理,但排序会带来额外的O(nlogn)时间开销,常规场景不推荐。

内容的提问来源于stack exchange,提问作者Izabela Górska

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 20:36:02