有没有一种方法可以在数组x上运行.push()方法? (在for循环之外)

时间:2020-02-04 18:23:53

标签: javascript arrays

我正在研究“移动零点” Leetcode问题。系统要求您将所有零移动到数组的末尾,而不更改非零元素的顺序。我的计划是遍历该数组,并为每个零拼接删除该数组,并将计数器增加1。然后将0推到数组计数器(或x)次。这是我的代码:

var moveZeroes = function(nums) {
    let counter = 0
    for (let i =0; i<nums.length; i++) {
        if (nums[i]===0) {
            nums.splice(i,1);
            counter+=1;
        }
    }
    nums.push()
};

P.S。我试图避免第二个for循环,或将push()添加到第一个for循环中。因此,寻找在for循环之外运行push方法x次的方法。谢谢

3 个答案:

答案 0 :(得分:2)

这是可能,是的,但实际上只是隐藏了另一个循环(推零的循环将埋在push中)。基本上,您可以创建一个充满0的数组,然后推送该数组的内容。您可以在以下期间进行操作:

var moveZeroes = function(nums) {
    let counter = 0
    let zeros = [];        // ***
    for (let i =0; i<nums.length; i++) {
        if (nums[i]===0) {
            nums.splice(i,1);
            counter+=1;
            zeros.push(0); // ***
        }
    }
    nums.push(...zeros)    // ***
};

或之后,但这又增加了一个循环:

var moveZeroes = function(nums) {
    let counter = 0
    for (let i =0; i<nums.length; i++) {
        if (nums[i]===0) {
            nums.splice(i,1);
            counter+=1;
        }
    }
    nums.push(...Array(counter).fill(0)); // ***
};

如果您想坚持使用splice的方法,可以在进行过程中push,而不是事后:

var moveZeroes = function(nums) {
    let counter = 0
    for (let i = 0, l = nums.length; i < l; i++) {
    // −−−−−−−−−−−−^^^^^^^^^^^^^^^^    ^^^
        if (nums[i] === 0) {
            nums.splice(i,1);
            nums.push(0);      // ***
            --l                // ***
        }
    }
};

答案 1 :(得分:1)

是的,您可以这样做:

nums.push(...Array(counter).fill(0))

这使用push处理多个参数的可能性,而其余语法(双关语意味)则使用扩展语法。

答案 2 :(得分:1)

您可以采用另一种方法,即使用两个循环,并在第一个循环中移动所有非零元素,在第二个循环中将零填充为其余元素。

var array = [0, 1, 2, 0, 0, 0, 3, 0],
    i = 0,
    j = 0;

while (j < array.length) {
    if (array[j] !== 0) array[i++] = array[j];
    j++;
}

while (i < array.length) {
    array[i] = '0';
    i++;
}

console.log(...array);