Java:两个无序数组相同元素计数异常问题求助
问题:统计两个数组中相同数字的数量,代码始终返回4的错误修复
需求与约束
- 需求:统计
code数组与guess数组中相同数字的总数量(示例:code = [1, 2, 5, 6]、guess = [4, 1, 3, 2]时,应返回2) - 约束:不能直接修改参数数组
原代码的问题分析
你当前的实现逻辑完全不符合需求:排序后比对相同位置的元素,本质是在找排序后位置和数字都一致的元素,而非两个数组中所有相同数字的总数。
- 你提到“无论输入如何结果始终返回4”,大概率是测试时用了元素完全相同的数组,此时排序后每个位置都匹配,所以返回4;但如果换用元素不同的数组,结果就会出错(比如
code = [1,2,3,4]、guess = [5,6,7,8],代码会返回0,这虽然结果正确,但只是巧合)。 - 比如
code = [1,1,2,3]、guess = [1,2,2,4],按需求应返回3(1出现1次、2出现2次,累加最小值1+2),但原代码排序后比对相同位置只能得到2个匹配,结果错误。
正确实现方案
我们需要统计两个数组中每个数字的出现次数,对每个数字取两个数组中出现次数的最小值,累加这些最小值就是最终结果。以下是两种实现方式:
方式1:适用于数字范围为0-9的场景(猜数字游戏常见情况)
public static int digits(int[] code, int[] guess) { // 创建计数数组,统计code中每个数字的出现次数 int[] countCode = new int[10]; for (int num : code) { countCode[num]++; } int matchCount = 0; // 遍历guess数组,每找到一个在code中存在的数字,就减少计数并累加匹配数 for (int num : guess) { if (countCode[num] > 0) { matchCount++; countCode[num]--; } } return matchCount; }
方式2:适用于任意整数范围的场景
import java.util.HashMap; import java.util.Map; public static int digits(int[] code, int[] guess) { Map<Integer, Integer> codeCount = new HashMap<>(); // 统计code中每个数字的出现次数 for (int num : code) { codeCount.put(num, codeCount.getOrDefault(num, 0) + 1); } int matchCount = 0; // 遍历guess数组计算匹配数 for (int num : guess) { if (codeCount.containsKey(num) && codeCount.get(num) > 0) { matchCount++; codeCount.put(num, codeCount.get(num) - 1); } } return matchCount; }
验证示例
当code = [1, 2, 5, 6]、guess = [4, 1, 3, 2]时:
- 统计
code的计数数组为[0,1,1,0,0,1,1,0,0,0] - 遍历
guess:4(无匹配)→1(匹配,计数减为0,匹配数=1)→3(无匹配)→2(匹配,计数减为0,匹配数=2) - 最终返回2,完全符合需求。
内容的提问来源于stack exchange,提问作者cymru_yesac
相关产品推荐
相关产品推荐

