leetcode.com - 删除元素 - 为什么 i++ 不起作用?



我正在研究一种来自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 不相关。所以这个错误的代码是偶然工作的...

最新更新