我正在处理leetcode 283。移动零的问题,但我得到了一个奇怪的测试失败,当有一个0旁边的另一个0。
下面是我的代码。
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let i = 0;
while(i < nums.length){
if(nums[i] == 0){
nums.push(nums.splice(i, 1))
}
i++
}
};
所有测试例都通过,当测试例的后面是0时,表示测试例失败。
输入num =(0, 0, 1、3、12)输出[0] 0、1、3、12日预期(1、3、12 0 0]
输入num =(0, 0, 0, 0, 0, 1, 0]输出(0, 0, 1, 0, 0, 0, 0)预期[1, 0, 0, 0, 0, 0, 0)
你能告诉我我错过了什么地方吗?
您正在推进索引,同时删除数组的前一个元素,因此您每两个连续的零跳过一个。
此外,由于splice返回的是一个数组(而不是单个元素),因此您正在推入一个数组,使最终数组有点奇怪:
var moveZeroes = function(nums) {
let i = 0;
while(i < nums.length){
console.log('checking',i,' of ', nums.length,' value:',nums[i]);
if(nums[i] == 0){
nums.push(nums.splice(i, 1))
}
console.log('nums is now',nums);
i++
}
};
moveZeroes([0,0,1,3,12])
作为一种解决方案,我将使用filter
,它允许您将零值与非零值分开:
var moveZeroes = function(nums) {
Object.assign(nums,nums.filter(x => x!=0).concat(nums.filter(x => x ==0)));
}
n1 = [0,0,1,3,12];
n2 = [0,0,0,0,0,1,0];
console.log(n1);
moveZeroes(n1);
console.log(n1);
console.log(n2);
moveZeroes(n2);
console.log(n2);
(在不久的将来,我们将有group
,这将使没有必要多次调用filter
进行分类)