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

数组遇零将右侧元素左移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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:55:39