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

查找数组最高频率及对应元素的C语言代码报错排查

代码错误点定位

1. 时间复杂度过高导致超时

你使用冒泡排序对长度为20000的数组排序,冒泡排序时间复杂度为O(n²),20000个元素的排序需要执行约4亿次操作,远超评测机的时间限制,必然会触发超时错误。

2. 输出末尾多余空格的问题

你的输出空格逻辑是判断j<N-1就加空格,但如果最高频率元素的最后一个不在数组最后一位,就会在输出末尾多输出一个空格,大部分评测系统对行尾空格零容忍,会直接判为格式错误。

3. 可变长度数组(VLA)兼容性问题(第一版代码)

int A[T][20000]属于C语言的可变长度数组特性,部分旧标准的C编译器不支持该特性,提交时会直接编译失败。

4. 多余的getchar()调用(非必现问题,但存在隐患)

scanf("%d")本身会自动跳过所有空白字符(空格、换行、制表符等),额外的getchar()属于多余操作,若输入格式存在特殊情况(比如行尾有多个空白符、Windows换行符\r\n等),可能会读取到错误的字符,导致后续输入异常。


优化实现建议

你完全不需要排序数组,利用题目给出的Xi ≤ 2×10^5的约束,直接开计数数组统计频率即可,时间复杂度为O(n),完全满足性能要求,实现逻辑也更简单:

#include <stdio.h>
#include <string.h>

#define MAX_X 200001

int cnt[MAX_X];

int main() {
    int T;
    scanf("%d", &T);
    for (int case_num = 1; case_num <= T; case_num++) {
        memset(cnt, 0, sizeof(cnt));
        int N, x, max_freq = 0;
        scanf("%d", &N);
        for (int i = 0; i < N; i++) {
            scanf("%d", &x);
            cnt[x]++;
            if (cnt[x] > max_freq) max_freq = cnt[x];
        }
        printf("Case #%d: %d\n", case_num, max_freq);
        int first = 1;
        for (int i = 1; i < MAX_X; i++) {
            if (cnt[i] == max_freq) {
                if (!first) printf(" ");
                printf("%d", i);
                first = 0;
            }
        }
        printf("\n");
    }
    return 0;
}

上述代码从1到2e5遍历计数数组,输出的元素天然就是升序,不需要额外排序,也不会出现末尾多余空格的问题。


内容的提问来源于stack exchange,提问作者Christopher Nathanael Tessy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:09:01