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
相关产品推荐
相关产品推荐

