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

数组复制零代码中i=i+1的作用及位置合理性解析

数组复制零功能中i=i+1的作用及位置解析

你编写的Java代码实现了固定长度整数数组中复制每个出现的零(复制后右侧元素右移)的功能,目前能得到预期输出,但之前因遗漏i=i+1导致错误。你的代码如下(已补上缺失的Arrays类导入,否则运行会报错):

import java.util.Arrays;

public class Dupzero {
    static int dup = 0;
    
    public static void duplicateZeros(int[] arr) {
        // 遍历数组所有元素
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] == 0) {
                // 从数组倒数第二位开始,将元素向右移一位
                for(int j = arr.length - 2; j >= i; j--) {
                    arr[j+1] = arr[j];
                }
                i = i + 1;
            }
        }
        System.out.println(Arrays.toString(arr));
    }

    public static void main(String[] args) {
        int []arr = {1,0,2,3,0,4,5,0};
        duplicateZeros(arr);
    }
}

一、i=i+1的作用

当遍历到原数组中的0时,代码会将该位置右侧的所有元素整体右移一位,最终把当前位置的0"复制"到下一个位置(右移后,原i位置的0保留,i+1位置会被原i位置的0覆盖,变成新的0)。

如果没有i=i+1,for循环自带的i++会让下一次遍历指向这个新复制出来的0,进而触发又一轮复制操作,导致同一个原0被多次复制,最终输出结果完全不符合需求。

所以i=i+1的核心作用是:手动跳过新复制出来的0,只处理原数组中原本存在的0,避免重复复制。

二、语句位置是否正确

这个语句的位置是完全正确的:

  • 它被放在if(arr[i]==0)代码块的末尾,也就是完成右移复制操作之后。只有当我们确实处理了一个原数组中的0时,才会执行这次额外的i递增;
  • 如果把它放在右移操作之前,会导致还没完成复制就跳过当前的0,逻辑直接错误;如果放在if代码块外面,会导致不管元素是不是0都额外加1,遍历会跳过大量元素,结果完全混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:55:17