LeetCode 283. Move Zeroes:连续零场景测试失败求助
问题分析与修复
你的代码存在两个关键问题:
1. 连续0被跳过处理
当你用splice(i, 1)移除当前位置的0后,数组中i位置之后的所有元素都会向前移动一位,原本在i+1位置的元素会跑到i位置。但你紧接着执行了i++,导致这个新移到i位置的元素(也就是下一个0)被跳过,没有被检查处理。
比如测试用例[0,0,1,3,12]:
- 第一次循环i=0,移除0后数组变成
[0,1,3,12],然后i变成1; - 此时i=1对应的元素是1,不会进入移除逻辑,直接i++,导致留在数组开头的0被遗漏。
2. splice返回值处理错误
nums.splice(i, 1)返回的是包含被移除元素的数组,直接用nums.push(...)会把这个数组作为一个元素push到原数组末尾,导致数组嵌套(比如原本的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){ // 取splice返回数组的第一个元素,避免嵌套 nums.push(nums.splice(i, 1)[0]); // 移除0后不递增i,因为下一个元素已经移到当前i位置 } else { // 非0元素才递增i,继续检查下一位 i++; } } };
修复逻辑说明
- 遇到0时:移除当前元素并将其push到数组末尾,此时不递增i,因为后续元素已经前移,当前i位置的新元素需要重新检查;
- 遇到非0元素时:递增i,继续检查下一个位置;
- 修正splice的返回值处理,取
[0]拿到被移除的单个元素,避免数组嵌套。
用这个代码测试你的两个用例:
- 测试用例1:输入
[0,0,1,3,12]→ 输出[1,3,12,0,0](符合预期); - 测试用例2:输入
[0,0,0,0,0,1,0]→ 输出[1,0,0,0,0,0,0](符合预期)。
内容的提问来源于stack exchange,提问作者Hailey
相关产品推荐
相关产品推荐

