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

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]时:

  1. 统计code的计数数组为[0,1,1,0,0,1,1,0,0,0]
  2. 遍历guess:4(无匹配)→1(匹配,计数减为0,匹配数=1)→3(无匹配)→2(匹配,计数减为0,匹配数=2)
  3. 最终返回2,完全符合需求。

内容的提问来源于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 12:55:14