如何统计两个无序数组的匹配数字?解决含重复值时的计数错误问题
问题:统计Guess与Code数组的匹配数字数量(处理重复值问题)
需要对比guess数组与code数组,统计两者中匹配的正确数字总数。现有Java代码在code数组无重复值时可正常运行,但当code存在重复值时计算结果错误,问题出在第二个for循环的digits递减逻辑上。
原代码
public static int digits(int[] code, int[] guess) { int digits = 0; for (int i = 0; i < code.length; i++) { for (int j = 0; j < guess.length; j++) { if (guess[j] == code[i]) { digits++; break; } } } for (int i = 0; i < code.length; i++) { for (int j = i + 1; j < code.length; j++) { if (code[i] == code[j] && code[i] != guess[j] && code[j] != guess[i]) { digits--; } } } return digits; }
原代码问题分析
第一个循环的逻辑是遍历code的每个元素,只要guess中存在相同元素就计数+1。这种方式在code有重复值时会过度统计:比如code = [2,2]、guess = [2],第一个循环会把code里的两个2都匹配到guess的2,导致digits变成2,但实际正确匹配数应该是1。
第二个循环的修正逻辑完全错误:它仅检查code内的重复元素,且判断条件code[i] != guess[j] && code[j] != guess[i]无法准确识别重复计数的情况,根本无法修正过度统计的问题。
正确实现方案
正确的思路是统计每个数字在code和guess中的出现次数,对每个数字取两者的出现次数最小值,最终累加所有最小值得到总匹配数。这种方式能自然处理重复值,避免过度统计。
修正后的代码
public static int digits(int[] code, int[] guess) { // 假设数字范围是0-9,可根据实际场景调整数组长度 int[] codeNumCounts = new int[10]; int[] guessNumCounts = new int[10]; // 统计code中各数字出现次数 for (int num : code) { codeNumCounts[num]++; } // 统计guess中各数字出现次数 for (int num : guess) { guessNumCounts[num]++; } int totalMatches = 0; // 累加每个数字的最小匹配次数 for (int i = 0; i < 10; i++) { totalMatches += Math.min(codeNumCounts[i], guessNumCounts[i]); } return totalMatches; }
代码说明
- 用两个数组分别统计
code和guess中每个数字的出现次数,避免重复匹配的问题。 - 对每个数字,取
code和guess中该数字出现次数的较小值,这个值就是该数字能匹配的最大数量。 - 累加所有数字的最小匹配次数,得到的就是正确的总匹配数。
内容的提问来源于stack exchange,提问作者cymru_yesac
相关产品推荐
相关产品推荐

