You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:40:23