查找数组最高频率及对应元素的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
相关产品推荐
相关产品推荐

