如何原地移除数组特定条件元素并实现偶数乘2的原地修改?
原地修改数组:保留偶数并乘2,删除奇数
你用forEach遍历的时候直接用splice会踩坑——因为forEach是按数组初始的索引顺序遍历的,当你删除某个元素后,数组后面的元素会往前挪一位,下一次遍历的索引会跳过这个挪过来的元素,导致部分奇数漏删。
给你两种靠谱的原地修改方案:
方案一:倒序遍历+ splice
倒着遍历数组,删除元素时不会影响还没处理的元素(因为未处理的元素都在当前索引的左边,删除当前元素不会改变它们的位置),同时处理偶数:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (let i = arr.length - 1; i >= 0; i--) { if (arr[i] % 2 !== 0) { arr.splice(i, 1); // 删除当前奇数 } else { arr[i] *= 2; // 偶数乘2 } } console.log(arr); // 输出 [4, 8, 12, 16, 20]
方案二:双指针法(更高效)
如果数组很大,多次splice会导致性能问题(每次splice都是O(n)操作),双指针法是O(n)时间复杂度,更高效:
用一个指针记录要保留元素的位置,遍历数组时把符合条件的元素(偶数乘2)放到这个位置,最后截断数组:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let ptr = 0; // 记录有效元素的存放位置 for (let i = 0; i < arr.length; i++) { if (arr[i] % 2 === 0) { arr[ptr] = arr[i] * 2; // 处理后放到ptr位置 ptr++; } } arr.length = ptr; // 截断数组,去掉后面无效的元素 console.log(arr); // 输出 [4, 8, 12, 16, 20]
为什么forEach不行?
举个例子:当你遍历到索引0的元素1(奇数),用splice(0,1)删除后,数组变成[2,3,4,...],但forEach下一次会去索引1的位置,也就是原来的3,跳过了现在在索引0的2,导致这个元素不会被处理。
内容的提问来源于stack exchange,提问作者Axnyc
相关产品推荐
相关产品推荐

