C语言数组最小众数统计程序反向用例无输出问题排查
问题诊断
你遇到的问题核心是两处明显错误,所谓「反向排列数组异常」只是未初始化变量的随机值导致的巧合,和数组输入顺序无关:
- 变量未初始化:寻找最小最高频数字的循环中,
int min;未初始化,属于野值,第一次测试用例运行时野值刚好小于最高频率2,条件触发正常输出;第二次测试用例运行时野值大于等于2,arr[i] > min条件永远不成立,因此无对应数字输出。 - 逻辑冗余错误:你已经提前计算出了最高频率
freq,不需要再重复比较频率大小,直接从小到大遍历计数数组,第一个出现arr[i] == freq的下标就是你需要的最小最高频数字。 - 隐含风险:如果输入的数字大于等于200000,会触发数组越界访问,导致不可预期的结果,建议先确认输入数字的取值范围,或者改用哈希表做计数。
修复后代码
#include <stdio.h> int main(){ long long t, n; scanf("%lld",&t); //输入测试用例总数 for(int x=0;x<t;x++) { scanf("%lld",&n); //输入当前用例的数组长度 long long arr[200000]={0}; long long i, count, freq=0; for(i=0; i<n; i++){ scanf("%lld", &count); //输入数组元素并计数 // 若输入数字可能超过199999,可在此处加边界判断避免越界 arr[count]++; } // 计算最高出现频率 for(i=0; i<200000; i++){ if(arr[i] > freq){ freq = arr[i]; } } printf("Case #%d: %lld\n",x+1,freq); // 从小到大遍历,第一个匹配最高频率的就是最小最高频数字 for(i=0; i<200000; i++){ if(arr[i] == freq){ printf("%lld\n",i); break; // 找到后直接退出,保证取到最小值 } } } return 0; }
内容的提问来源于stack exchange,提问作者Kang Nul
相关产品推荐
相关产品推荐

