求助:编写限制元素重复次数不超过n的数组处理函数(附错误代码)
修复限制数组元素重复次数的函数
你的代码问题分析
- 标签循环逻辑错误:使用
first:标签跳过连续重复元素的方式,会导致每个元素仅在首次出现时被处理,后续相同元素的处理被跳过,但内部循环又会把该位置之后的所有相同元素全部加入结果,完全没做到次数限制。 - 计数变量未递增:内部循环里的
count变量从未自增,导致count <3的条件始终成立,会把所有相同元素都推入结果数组,无法限制次数。 - 未封装为通用函数:硬编码了输入数组和
n=3,不符合题目要求的“接收数组和数字n”的函数设计。
正确实现方案
下面是满足需求的函数,通过Map记录每个元素已加入结果的次数,遍历原数组时仅保留不超过n次的元素,同时保持原数组顺序:
function limitDuplicates(arr, n) { const result = []; const countTracker = new Map(); for (const num of arr) { const currentCount = countTracker.get(num) || 0; if (currentCount < n) { result.push(num); countTracker.set(num, currentCount + 1); } } return result; } // 测试示例 const inputArr = [1, 2, 4, 4, 4, 2, 2, 2, 2]; const maxRepeat = 3; console.log(limitDuplicates(inputArr, maxRepeat)); // 输出: [1, 2, 4, 4, 4, 2, 2]
基于你的代码修改版本
如果要保留你原有的循环思路,修改后的代码如下:
function limitDuplicates(arr, n) { const result = []; const countMap = {}; for (let i = 0; i < arr.length; i++) { const currentNum = arr[i]; // 初始化元素的计数 if (!countMap[currentNum]) { countMap[currentNum] = 0; } // 计数未达上限则加入结果并更新计数 if (countMap[currentNum] < n) { result.push(currentNum); countMap[currentNum]++; } } return result; } // 测试 const testArr = [1, 2, 4, 4, 4, 2, 2, 2, 2]; console.log(limitDuplicates(testArr, 3)); // 输出: [1, 2, 4, 4, 4, 2, 2]
内容的提问来源于stack exchange,提问作者antikque
相关产品推荐
相关产品推荐

