Java查找整型数组重复值时嵌套循环重复计数问题如何解决
数组重复值判定与定位实现方案
现有代码问题说明
- 比对逻辑重复:内层循环
j从0开始全量遍历,(f=a,j=b)和(f=b,j=a)会对同一对元素重复判定,导致重复计数 - 判定条件逻辑错误:当前判断的是下标
f是否等于j且等于10,长度为4的数组下标最大值为3,永远触发不了该条件,且需要比对的是数组存储的元素值而非下标 - 运算符使用不规范:条件中的
&是按位与,此处逻辑判断场景应该使用逻辑与&&
优化后的嵌套循环实现(无重复计数)
内层循环从f+1开始遍历,每一对元素仅比对一次,不会出现重复计数问题,同时可定位重复取值:
import java.util.HashSet; import java.util.Set; public class CheckDuplicate { public static void main(String[] args) { int[] bonusGame = {/* 替换为你的数组元素 */}; // 存储已经找到的重复值,避免同一个重复值多次输出 Set<Integer> duplicateValues = new HashSet<>(); for (int f = 0; f < bonusGame.length; ++f) { // 内层从f的下一个下标开始,避免重复比对同一对元素 for (int j = f + 1; j < bonusGame.length; ++j) { // 比对两个下标对应的元素值是否相等 if (bonusGame[f] == bonusGame[j]) { // 仅当该重复值没有被记录过的时候输出 if (!duplicateValues.contains(bonusGame[f])) { System.out.println("找到重复取值:" + bonusGame[f]); // 匹配业务需求:出现值为10的重复时触发中奖提示 if (bonusGame[f] == 10) { System.out.println("You won 10 Euro"); } duplicateValues.add(bonusGame[f]); } } } } // 无重复值的场景提示 if (duplicateValues.isEmpty()) { System.out.println("数组中无重复值"); } } }
低时间复杂度可选方案
如果后续数组长度扩容,可采用单次遍历的哈希表方案,时间复杂度为O(n):
import java.util.HashSet; import java.util.Set; public class CheckDuplicate { public static void main(String[] args) { int[] bonusGame = {/* 替换为你的数组元素 */}; Set<Integer> tempSet = new HashSet<>(); Set<Integer> duplicateValues = new HashSet<>(); for (int num : bonusGame) { // add方法返回false说明元素已存在,即为重复值 if (!tempSet.add(num)) { duplicateValues.add(num); } } // 处理重复值逻辑 for (int duplicate : duplicateValues) { System.out.println("找到重复取值:" + duplicate); if (duplicate == 10) { System.out.println("You won 10 Euro"); } } if (duplicateValues.isEmpty()) { System.out.println("数组中无重复值"); } } }
内容的提问来源于stack exchange,提问作者Ruslan Pylypiuk
相关产品推荐
相关产品推荐

