
本文介绍一种原地修改整型数组的void方法:遍历数组,对每个首次出现的重复值及其所有后续重复项统一置零,确保所有重复元素(包括第一个)均被替换为0,不使用额外集合或数组。
在Java中,若需以void方式原地处理一个int[]数组——即不返回新数组、仅修改原始数组,并将所有重复出现的整数全部替换为0(注意:不是仅保留首个、其余置零,而是“只要该值在整个数组中出现超过一次,所有该值的实例都应变为0”),关键在于正确识别“重复值”并统一清除。
例如:输入 {2, 2} 应输出 {0, 0};输入 {1, 2, 2, 3, 1} 应输出 {0, 0, 0, 3, 0}(因为 1 和 2 均重复,所有 1 和 2 都被置零;而 3 仅出现一次,保留原值)。
以下是符合要求的实现:
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];
boolean isDuplicate = false;
// 向后查找是否存在相同值(避免重复判断自身)
for (int j = i + 1; j < array.length; j++) {
if (array[j] == temp) {
isDuplicate = true;
array[j] = 0; // 后续重复项置零
}
}
// 若当前元素temp被判定为重复值,则自身也置零
if (isDuplicate) {
array[i] = 0;
}
}
}✅ 核心逻辑说明:
立即学习“Java免费学习笔记(深入)”;
- 外层循环 i 遍历每个位置作为“基准值”;
- 内层循环 j 从 i+1 开始向后扫描,查找是否还有相同值;
- 一旦发现任一匹配(array[j] == temp),标记 isDuplicate = true,并立即将 array[j] 置零;
- 循环结束后,若 isDuplicate 为真,说明 temp 是重复值 → 将 array[i](即该值首次出现的位置)也置零。
⚠️ 注意事项:
- 此方法时间复杂度为 O(n²),适用于小规模数组;大规模场景建议改用 HashSet 辅助统计频次(但会违背“纯原地、无额外数据结构”的约束);
- 不要将内层循环设为 j = 0 或 j
- 判定重复必须基于全局出现次数 ≥ 2,因此不能仅靠相邻比较或单次扫描完成,需两轮遍历或预统计。
该方案严格满足题目要求:void 方法、原地修改、所有重复值(含首个)统一替换为 0,逻辑清晰且易于验证。










