数组复制零代码中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
相关产品推荐
相关产品推荐

