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
相关产品推荐
相关产品推荐

