有没有办法在数组上运行 .push() 方法的次数 x 次?(在 for 循环之外)



我正在研究"移动零"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()
};

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

是的,你可以这样做:

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

这使用push的可能性来处理多个参数,而 spread 语法完成其余的工作(双关语(。

这是可能的,有点,是的,但它实际上只是隐藏了另一个循环(推动零的循环将被埋在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                // ***
}
}
};

你可以采取另一种方法,使用两个循环,在第一个循环中移动所有不是零的元素,在第二个循环中用零填充其余元素。

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);

最新更新