Java中实现void方法替换int数组重复项为0的问题求解
问题分析与修正
你的代码核心问题有两个:
错误的判断条件:
j+1 < array.length完全多余,它导致数组的最后一个元素永远无法被替换为0——哪怕它是重复项。比如输入{2,2}时,当j=1(最后一个索引),j+1=2等于数组长度2,不满足条件,所以不会修改这个位置的值。逻辑顺序缺陷:外层循环遍历到
i=0时,会把array[0]改成0;当i=1时,temp取的是array[1]=2,此时内层循环遍历j=0时,array[j]已经是0,和temp不匹配,而j=1又被上述条件跳过,最终导致第二个2无法被替换。
修正方案(符合你需求的实现)
如果你的需求是:只要元素出现次数超过1次,所有该元素的位置都替换为0(比如{2,2}输出{0,0}),可以用以下两种实现方式:
方式一:用哈希表统计次数(简洁高效)
import java.util.HashMap; import java.util.Map; public static void removeDuplicates(int[] array) { // 统计每个元素的出现次数 Map<Integer, Integer> countMap = new HashMap<>(); for (int num : array) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } // 遍历数组,将出现多次的元素替换为0 for (int i = 0; i < array.length; i++) { if (countMap.get(array[i]) > 1) { array[i] = 0; } } }
方式二:不用额外集合(双重循环标记重复值)
如果你不想引入集合类,也可以先标记所有重复的元素值,再统一替换:
import java.util.HashSet; import java.util.Set; public static void removeDuplicates(int[] array) { Set<Integer> duplicateNums = new HashSet<>(); // 第一遍遍历,找出所有重复的元素值 for (int i = 0; i < array.length; i++) { int current = array[i]; // 检查当前元素后面是否有重复 for (int j = i + 1; j < array.length; j++) { if (array[j] == current) { duplicateNums.add(current); break; // 找到重复就标记,无需继续检查 } } } // 第二遍遍历,替换重复元素为0 for (int i = 0; i < array.length; i++) { if (duplicateNums.contains(array[i])) { array[i] = 0; } } }
这两种方式都能正确处理{2,2}的情况,输出{0,0},同时满足void方法修改原数组的要求。
内容的提问来源于stack exchange,提问作者A_K_A
相关产品推荐
相关产品推荐

