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

Java一维数组非零元素左移方法实现技术求助

解决Java数组非零元素左移的问题

嘿,我来帮你搞定这个需求!把一维数组里的所有非零元素移到左侧,同时保证高效性,这里有两种实用的实现思路,我给你详细讲讲:

方法一:双指针交换法(保持非零元素相对顺序)

这个方法用两个指针配合,在原地修改数组,时间复杂度是O(n),空间复杂度O(1),还能保留非零元素原来的顺序:

import java.util.Arrays;

public class ArrayUtils {
    public static void moveNonZeroToLeft(int[] arr) {
        // 边界判断:数组为空或长度为0直接返回
        if (arr == null || arr.length == 0) {
            return;
        }
        
        // pointerLeft:记录下一个非零元素应该放置的位置
        int pointerLeft = 0;
        // pointerRight:遍历整个数组找非零元素
        for (int pointerRight = 0; pointerRight < arr.length; pointerRight++) {
            if (arr[pointerRight] != 0) {
                // 交换当前非零元素到pointerLeft的位置
                int temp = arr[pointerLeft];
                arr[pointerLeft] = arr[pointerRight];
                arr[pointerRight] = temp;
                // 指针右移,准备下一个非零元素
                pointerLeft++;
            }
        }
    }

    // 测试示例
    public static void main(String[] args) {
        int[] testArr = {0, 3, 0, 2, 5, 0, 1};
        moveNonZeroToLeft(testArr);
        System.out.println(Arrays.toString(testArr)); 
        // 输出:[3, 2, 5, 1, 0, 0, 0]
    }
}

代码逻辑说明:

  • pointerLeft一开始指向数组第一个位置,每次找到非零元素就把它交换到pointerLeft的位置,然后pointerLeft右移一位。
  • 遍历完成后,pointerLeft左边的所有元素都是非零,右边全是零,而且非零元素的顺序和原数组一致。

方法二:覆盖填充法(更简洁的写法,同样保持顺序)

如果不想用交换,也可以先把所有非零元素依次填充到数组左侧,最后把剩余位置统一设为0,逻辑更直观:

import java.util.Arrays;

public class ArrayUtils {
    public static void moveNonZeroToLeft(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }

        int index = 0;
        // 第一步:把所有非零元素移到左边
        for (int num : arr) {
            if (num != 0) {
                arr[index++] = num;
            }
        }
        // 第二步:把剩余位置填充为0
        while (index < arr.length) {
            arr[index++] = 0;
        }
    }

    public static void main(String[] args) {
        int[] testArr = {0, 3, 0, 2, 5, 0, 1};
        moveNonZeroToLeft(testArr);
        System.out.println(Arrays.toString(testArr)); 
        // 输出:[3, 2, 5, 1, 0, 0, 0]
    }
}

代码逻辑说明:

  • 先通过遍历把所有非零元素按顺序放到数组的前半部分,用index记录当前填充的位置。
  • 遍历结束后,index到数组末尾的位置全部设为0,完成需求。

如果之前你的尝试无效,大概率是指针移动逻辑出错,或者没处理数组为空/全零这类边界情况,你可以对比上面的代码排查问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:08:10