C语言笔试题:实现含相同频次值额外输出的直方图统计
问题解答
第二部分代码量评估
这道题的第二部分完全不需要编写大量额外代码,也不需要复杂的字符串拼接逻辑,整体仅需10~15行额外代码即可实现。
C语言场景下可以直接边判断边输出,不需要提前拼接完整字符串再打印,核心实现逻辑非常简单:
- 先遍历15对应的频次统计结果,找到对应数值数量≥2的频次值(由于数值范围只有15,两层循环的遍历成本可以忽略)
- 匹配到符合要求的频次后,依次输出对应数值,仅需用分支判断当前输出的是第几个匹配项,分别处理逗号、
and的拼接即可 - 最后输出固定后缀和频次值即可
参考实现代码如下:
int target_cnt = 0, match_num = 0; // 查找符合要求的频次值 for (int cnt = 20; cnt >= 0; cnt--) { match_num = 0; for (int i = 1; i <= 5; i++) { if (histogram[i] == cnt) match_num++; } if (match_num >= 2) { target_cnt = cnt; break; } } // 按要求格式输出 if (match_num >= 2) { printf("The values "); int printed = 0; for (int i = 1; i <= 5; i++) { if (histogram[i] == target_cnt) { if (printed == 0) { printf("%d", i - 1); } else if (printed == match_num - 1) { printf(" and %d", i - 1); } else { printf(", %d", i - 1); } printed++; } } printf(" occur %d times each.\n", target_cnt); }
考试难度定位评估
这道题完全符合大一计算机专业入门课C语言30分钟纸笔考试的难度定位,理由如下:
- 所有知识点都是入门级的循环、条件分支操作,没有涉及指针、字符串函数、动态内存等进阶考点
- 整道题总代码量仅30行左右,纸笔书写耗时不超过15分钟,剩余时间足够完成审题、校验逻辑的工作
- 第二问的考察目的是逻辑分支处理能力,不是字符串拼接,给出的示例输出已经明确了格式要求,不会出现无意义的考点卡壳情况
内容的提问来源于stack exchange,提问作者Arcturus
相关产品推荐
相关产品推荐

