You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计两个无序数组的匹配数字?解决含重复值时的计数错误问题

问题:统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:15:32