我正在研究“移动零点” 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次的方法。谢谢
答案 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);