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

C语言数组重复元素计数函数结果异常问题求助

问题分析与解决方案

你的问题很典型——原代码统计的是所有重复元素对的数量,而不是你想要的重复元素的种类数(即出现次数≥2的元素有多少种)。

为什么原代码返回6?

咱们拿元素7举例,它在数组里出现了3次(索引1、6、10):

  • 当i=1时,j=6和j=10会各匹配一次,计数器+2
  • 当i=6时,j=10又会匹配一次,计数器+1
    光7就贡献了3次计数,再加上45(1次)、64(1次)、0(1次),总和就是3+1+1+1=6,这就是你得到6的原因。

如何修复?

我们需要的是:只要某个元素出现过至少2次,就算它是一个重复元素,而且只统计一次。可以用两种思路:

  • 标记已经统计过的元素,避免重复计数
  • 使用哈希表(或数组,若元素范围已知)记录元素出现次数,最后统计次数≥2的元素数量

方法1:标记已统计的元素(适合小规模数组)

我们可以在找到一个重复元素后,用布尔数组标记后续相同的元素,避免重复计数。

修正后的代码:

int countDuplicates(int array[], int size) {
    int i, j;
    int counter = 0;
    // 用布尔数组标记是否已经统计过该元素
    int counted[size];
    // 初始化所有元素为未统计
    for (i = 0; i < size; i++) {
        counted[i] = 0;
    }

    for (i = 0; i < size; i++) {
        // 如果当前元素已经被统计过,跳过
        if (counted[i]) continue;
        int hasDuplicate = 0;
        for (j = i + 1; j < size; j++) {
            if (array[i] == array[j]) {
                hasDuplicate = 1;
                counted[j] = 1; // 标记后续重复元素为已统计
            }
        }
        if (hasDuplicate) {
            counter++;
        }
    }
    return counter;
}

方法2:用哈希表统计出现次数(更高效,适合大数组)

如果数组元素范围较大,或者追求更高效率,用数组模拟哈希表统计每个元素的出现次数,最后遍历统计次数≥2的元素数量(以下版本适配你的测试数组元素范围):

int countDuplicates(int array[], int size) {
    int count[201] = {0}; // 覆盖-100到100的元素,索引=元素+100
    int counter = 0;

    for (int i = 0; i < size; i++) {
        int index = array[i] + 100;
        count[index]++;
    }

    for (int i = 0; i < 201; i++) {
        if (count[i] >= 2) {
            counter++;
        }
    }
    return counter;
}

测试验证

用你的测试数组{45, 7, -3, 5, 11, 64, 7, 45, 3, -5, 7, 0, 34, 64, 0, 9, 2, -85, 14, 21}测试,两个修正后的函数都会返回4,正好符合你预期的结果。

内容的提问来源于stack exchange,提问作者Amirkh7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:02:29