
该教程详解如何实现一个不返回新数组、仅原地修改输入数组的void方法,将所有重复出现的整数(包括首次出现的位置)统一替换为0,确保逻辑正确且避免遗漏首个重复项。
在Java中,若需原地处理整型数组——即不创建新数组、不返回值(void方法),同时将所有重复元素(含首次出现位置)全部替换为 0,关键在于正确识别“重复”的定义:只要某数值在数组中出现超过一次,其所有出现位置都应被置为 0。
原始代码的问题在于内层循环从 j = 0 开始,导致每次比较都会把 array[i] 自身(即 array[j] == temp 且 j == i 时)也设为 0,造成错误覆盖;更严重的是,它未区分“首次出现”与“后续重复”,无法保证所有重复值的全部实例均被归零。
✅ 正确思路是:
- 外层循环遍历至 array.length - 1(避免越界且无需检查最后一个元素是否为“首次重复”);
- 对每个 array[i],将其视为候选重复值 temp;
- 内层循环从 j = i + 1 开始向后查找——只检查后续位置是否出现相同值;
- 一旦发现 array[j] == temp,立即标记 array[j] = 0,同时将 array[i] 也置为 0(因为此时已确认 array[i] 是重复值的首次出现,不应保留);
- 注意:若 array[i] 后续未被任何 array[j] 匹配,则说明它是唯一值,保持不变。
以下是修正后的完整实现:
立即学习“Java免费学习笔记(深入)”;
public static void removeDuplicates(int[] array) {
if (array == null || array.length <= 1) {
return; // 空数组或单元素无需处理
}
for (int i = 0; i < array.length - 1; i++) {
int temp = array[i];
for (int j = i + 1; j < array.length; j++) {
if (array[j] == temp) {
array[j] = 0;
array[i] = 0; // 首次出现也归零 → 确保所有重复实例均被清除
}
}
}
}? 使用示例:
int[] arr = {2, 2, 3, 3, 4, 5, 2};
removeDuplicates(arr);
System.out.println(Arrays.toString(arr)); // 输出: [0, 0, 0, 0, 4, 5, 0]解释:2 出现三次 → 全部变 0;3 出现两次 → 全部变 0;4 和 5 各出现一次 → 保留原值。
⚠️ 注意事项:
- 该算法时间复杂度为 O(n²),适用于小规模数组;如需高性能去重(如大数据量或保留顺序),建议改用 LinkedHashSet 配合新数组重建,但不符合本题 void + 原地修改的要求;
- 方法不处理 null 输入,调用前建议校验;
- 若需求改为“仅后续重复项归零,首项保留”,则只需删除 array[i] = 0; 这一行——但本题明确要求“remove and replace duplicates”,语义上包含全部实例。
总结:核心在于理解“重复”的全局性,并通过 i+1 起始的内层扫描+即时首项归零,确保逻辑闭环。此方案简洁、符合约束,且可直接集成到现有代码中。










