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

LeetCode数组移零问题代码报错求助:请求排查错误原因

解决你的LeetCode移动零问题

嘿,我一眼就看到你代码里的几个问题啦,咱们一个个来理清楚:

1. 致命的循环条件错误

你写的for循环条件是:

for (int i = 0; i > nums.length;i++)

这里的判断条件是i > nums.length,但i初始值是0,而数组长度nums.length最小是0,所以这个条件从一开始就不成立,循环根本不会执行任何一次!这就是你代码运行没效果的核心原因,赶紧把条件改成i < nums.length才对。

2. 逻辑上的错误(即使循环条件改对了也会出问题)

假设你把循环条件改对了,当前的逻辑还是有问题:当nums[i]本身不是0的时候,你的while循环不会执行,j就等于i,然后你执行了:

nums[i] = nums[j]; // 相当于自己赋值给自己,没变化
nums[j] = 0; // 把原本非零的nums[i]改成了0!

比如输入[1,0],i=0时,j=i=0,执行完这两行后数组会变成[0,0],完全不符合预期。

正确的解法:双指针法

这道题最经典的解法是用双指针,既保证非零元素的相对顺序,又高效完成移动操作,有两种实现方式:

方式一:先移非零元素,再补零

class Solution {
    public void moveZeroes(int[] nums) {
        // 记录下一个非零元素要放置的位置
        int nonZeroPos = 0;
        // 遍历数组,把所有非零元素移到数组前面
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[nonZeroPos] = nums[i];
                nonZeroPos++;
            }
        }
        // 把剩下的位置全部设为0
        for (int i = nonZeroPos; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
}

方式二:原地交换(更简洁)

class Solution {
    public void moveZeroes(int[] nums) {
        int left = 0; // left指针指向当前需要放置非零元素的位置
        for (int right = 0; right < nums.length; right++) {
            // 右指针遇到非零元素,就和左指针位置交换
            if (nums[right] != 0) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                left++;
            }
        }
    }
}

这个思路的核心是:left指针始终等着放接下来的非零元素,right指针遍历整个数组,遇到非零就交换到left的位置,然后left右移。这样既保证了非零元素的相对顺序,又把所有零“挤”到了数组末尾。

内容的提问来源于stack exchange,提问作者Arif Howlader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:47:51