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

C语言如何统计数组多个重复元素、对应频率及总重复数

原代码问题分析
  • 频率统计逻辑错误:双循环中只要匹配到相同元素就累加频率,会导致同一个数值的频率被重复计算多次,统计结果完全不符合实际
  • 打印参数错误:输出频率时误用frequency[j]作为输出值,j是数组遍历索引,和元素值没有对应关系,输出的频率值为随机垃圾值
  • 无去重打印逻辑:每次匹配到重复元素就直接打印,导致同一个数值出现大量重复的输出条目
实现思路
  1. 先单次遍历原数组,以元素值为下标统计每个数值的出现频率,不需要嵌套循环
  2. 遍历原数组时搭配已访问标记,确保每个重复元素仅输出一次
  3. 统计符合要求的重复元素总数量,可根据需求选择统计「不同重复值的个数」或「所有重复出现的总次数」
  4. 频率数组的大小需大于数组中元素的最大值,若元素范围过大可改用哈希表实现频率统计
正确实现代码
#include <stdio.h>
// 频率数组大小根据实际元素最大值调整,此处设置为101可覆盖0~100的正整数
#define Frequency_size 101

void non_unique_numbers(int arr[], int size){
    int frequency[Frequency_size] = {0};
    int duplicate_total = 0;
    int visited[Frequency_size] = {0};
    
    // 第一步:统计所有元素的出现频率
    for(int i = 0; i < size; i++){
        frequency[arr[i]]++;
    }

    printf("重复元素统计结果:\n");
    // 第二步:输出去重后的重复元素和对应频率,统计总数量
    for(int i = 0; i < size; i++){
        int current_num = arr[i];
        // 仅输出出现次数≥2且未打印过的元素
        if(frequency[current_num] >= 2 && !visited[current_num]){
            printf("Number: %d , Frequency: %d\n", current_num, frequency[current_num]);
            visited[current_num] = 1;
            // 统计不同重复值的个数
            duplicate_total++;
            // 若需要统计所有重复出现的总次数,替换上面的计数行为:
            // duplicate_total += frequency[current_num] - 1;
        }
    }
    printf("总的重复元素数量:%d\n", duplicate_total);
}

// 测试示例
int main(){
    int array[] = {1, 2, 2, 1, 2, 4, 4, 5};
    int arr_size = sizeof(array) / sizeof(array[0]);
    non_unique_numbers(array, arr_size);
    return 0;
}
输出结果示例
重复元素统计结果:
Number: 1 , Frequency: 2
Number: 2 , Frequency: 3
Number: 4 , Frequency: 2
总的重复元素数量:3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:02