我正在研究一种来自leetcode的算法。
以下是描述:
给定一个数组和一个值,删除该值的所有实例 放置并返回新长度。不要为 分配额外的空间 另一个数组,您必须使用常量内存就地执行此操作。这 可以更改元素的顺序。你离开什么并不重要 超出新的长度。示例:给定输入数组编号 = [3,2,2,3], val = 3 你的函数应该返回长度 = 2,前两个 数字的元素为 2。
我的问题基于以下代码:
var removeElement = function(nums, val) {
var count = 0;
for(i=0; i<nums.length; i++){
if(nums[i] == val) {
nums.splice(i,1);
i--;
}
}
};
我的问题是,为什么使用 i-- 递减有效,但使用 i++ 递增不起作用?
我的答案不被接受的情况是当输入数组为 [3, 3] 且值为 3 时。
Splice 从数组中删除 i 处的元素,因此如果您想继续正常迭代,则需要保持在当前位置。由于 for 循环中有一个 i++,它通常会向前移动一个位置。所以你需要后退一步才能保持在同一位置。
nums=[3,2,2,3]
val=3;
//first iteration
i=0
current=3//===val
nums.splice(0,1);//nums=[2,2,3]
i--;//i=-1
//next iteration
i++;//i=0
current=2;
//next iteration
i++;//i=1
current=2;
//next iteration
i++;//i=2
current=3;
nums.splice(2,1);//nums=[2,2]
i--;//i=1
//next iteration
i++;//i=2 === nums.length => break
在 [3,2,2,3] 的情况下,是否使用 i++ 而不是 i-- 并不重要,因为它将跳过索引 1 和 2 不相关。所以这个错误的代码是偶然工作的...