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

C语言统计数组重复值时如何避免同一值被重复计数

问题根源

你的代码核心问题是外层循环没有跳过已经完成统计的重复元素:当你统计完arr[6]对应的所有9之后,外层循环还会继续走到arr[7]、arr[8]的9,再次触发统计逻辑,导致重复输出。此外还有两处语法错误需要先修正。

修正后代码(基于原有逻辑调整)

// 去掉宏定义的多余等号
#define NUM 9
int main() {
    // 补全数组的int类型声明
    int arr[NUM] = {1, 3, 4, 9, 2, 9, 2, 9, 7};
    sort_int_array(arr, NUM); //插入排序函数保持不变

    int i = 0, j, count;
    while (i < NUM) {
        count = 1;
        // 统计当前元素的重复次数
        for (j = i + 1; j < NUM && arr[i] == arr[j]; j++) {
            count++;
        }
        // 仅输出重复次数大于1的元素
        if (count > 1) {
            printf("%d instances of %d\n", count, arr[i]);
        }
        // 直接跳转到下一个不同元素的位置,避免重复统计
        i = j;
    }
    return 0;
}

关键改动说明

  • 修复语法错误:删除宏定义多余的等号,补全数组的int类型声明
  • 把外层for循环改成while循环,统计完当前值的所有重复项后,直接将索引跳转到下一个不同值的位置,从根源避免重复统计
  • 把重复判断移到内层循环结束后统一处理,避免数组末尾的重复元素无法触发输出的问题
  • 每次统计新元素时才初始化count,避免计数混乱

更高效的优化方案(仅需单层循环)

因为数组已经排序,相同元素连续排列,完全可以去掉内层循环,仅用一层遍历完成统计,时间复杂度O(n):

#define NUM 9
int main() {
    int arr[NUM] = {1, 3, 4, 9, 2, 9, 2, 9, 7};
    sort_int_array(arr, NUM);

    int count = 1;
    for (int i = 1; i < NUM; i++) {
        if (arr[i] == arr[i-1]) {
            count++;
        } else {
            if (count > 1) {
                printf("%d instances of %d\n", count, arr[i-1]);
            }
            count = 1;
        }
    }
    // 处理数组末尾的最后一组重复元素
    if (count > 1) {
        printf("%d instances of %d\n", count, arr[NUM-1]);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:54:00