【问题标题】:Given a fixed-length integer array arr, duplicate each occurrence of zero, shifting them to right - leetCode给定一个固定长度的整数数组 arr,复制每个出现的零,并将它们向右移动 - leetCode
【发布时间】:2026-01-15 23:50:01
【问题描述】:

条件是 输入:arr = [1,0,2,3,0,4,5,0] 输出:[1,0,0,2,3,0,0,4] 说明:调用你的函数后,输入数组修改为:[1,0,0,2,3,0,0,4]

    public void duplicateZeros(int[] arr) {
        int length = arr.length;
        for(int i=0;i<length;i++){
            if(arr[i]==0){
              arr[i+1]=arr[i];

            }
        }
        
        
    }
}

错误是

java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
  at line 6, Solution.duplicateZeros
  at line 54, __DriverSolution__.__helper__
  at line 84, __Driver__.main

为什么会出现这个错误?

【问题讨论】:

  • "为什么会出现这个错误?" - 因为最后一个数组索引处的值是0if(arr[i]==0),所以您尝试访问arr[i+1]。这超出了数组的范围,因此例外。
  • 所以我可以通过增加长度来解决这个错误?
  • 不,您不必增加数组的大小(如预期输出所示)。解决方案包括向数组中插入一个元素,同时将后面的值移回,每次都丢失最后一个值
  • 你能帮我实现算法吗,我只是知道,也许只是资源链接)

标签: java arrays


【解决方案1】:

试试这个。

public static void duplicateZeros(int[] arr) {
    int length = arr.length;
    for (int i = 0; i < length; i++) {
        if (arr[i] == 0) {
            System.arraycopy(arr, i, arr, i + 1, length - i - 1);
            ++i;
        }
    }
}

public static void main(String[] args) {
    int[] a = { 1, 0, 2, 3, 0, 4, 5, 0 };
    duplicateZeros(a);
    System.out.println(Arrays.toString(a));
}

输出:

[1, 0, 0, 2, 3, 0, 0, 4]

【讨论】:

    【解决方案2】:

    你的解决方案是错误的,i+1 会导致最后一个 i 的索引越界。

    你想要一些结果索引,在这里命名为j

         [1,0,2,3,0,4,5,0] 
      i   0 1 2 3 4 5 6 7   ---> for i
      j?  0   1 2   3 4    5 6 7
         [1,  2,3,  4,5,   0,0,0] 
    

    【讨论】:

      最近更新 更多