数组遇零将右侧元素左移1位实现求助(附现有代码)
解决数组零左移并将零移至末尾的问题
先说说你现有代码的问题哈
你的这段代码没法实现需求,主要有这几个坑:
- 当碰到
arr[i] == 0时,你只把arr[i]换成了arr[i+1],但没处理i+1后面的元素啊!这相当于只挪了一位,根本不是把零右侧所有元素都左移一位。 - 循环里每一次都执行
arr[arr.length - 1] = 0,这会导致还没处理完所有元素,最后一位就被强行设成0了,逻辑完全乱掉。 - 方法最后居然返回
null,这肯定不对啊,得返回处理好的数组arr才行。
给你两种靠谱的实现方式
方法一:双指针法(高效款,时间复杂度O(n))
这种方法用两个指针,一个nonZeroIndex专门记当前该放非零元素的位置,另一个指针遍历数组,把所有非零元素都挪到前面,最后把剩下的位置全填成0就行。
public int[] shiftArray(int[] arr) { if (arr == null || arr.length == 0) { return arr; } int nonZeroIndex = 0; // 把所有非零元素移到数组前半部分 for (int num : arr) { if (num != 0) { arr[nonZeroIndex++] = num; } } // 剩下的位置全部填充为0 while (nonZeroIndex < arr.length) { arr[nonZeroIndex++] = 0; } return arr; }
方法二:遇到零时逐个左移元素(直观款,时间复杂度O(n²))
要是你想严格按照最开始的思路——碰到零就把右侧所有元素左移一位,再把零丢去末尾,那可以这么写:
public int[] shiftArray(int[] arr) { if (arr == null || arr.length <= 1) { return arr; } int n = arr.length; for (int i = 0; i < n; i++) { if (arr[i] == 0) { // 把i右边的所有元素挨个左移一位 for (int j = i; j < n - 1; j++) { arr[j] = arr[j + 1]; } // 把当前这个零放到数组末尾 arr[n - 1] = 0; // 左移后当前i位置的元素可能还是零,得重新检查这个位置 i--; // 已经处理了一个零,后面不用再检查最后一位了 n--; } } return arr; }
测试一下
拿你给的例子[3,0,1,2]来测,两种方法都会返回[3,1,2,0],完全符合要求。
内容的提问来源于stack exchange,提问作者user8858291
相关产品推荐
相关产品推荐

