1. 题目解析与需求理解
PAT乙级1038题是一道典型的算法练习题,主要考察统计分析和排序算法的应用能力。题目通常会给出一个班级的学生成绩列表,要求统计每个分数段的学生人数,并按分数从高到低输出统计结果。
这类题目在实际编程面试和算法竞赛中非常常见,主要测试以下几个核心能力:
- 对大量数据的快速统计处理
- 哈希表或数组的高效运用
- 排序算法的合理选择
- 边界条件的处理能力
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法选择
2.1 基础解法分析
最直观的解法是使用哈希表(在C++中可以用unordered_map)来统计每个分数出现的次数。具体步骤:
- 初始化一个空的哈希表
- 遍历所有学生成绩,在哈希表中记录每个分数出现的次数
- 将哈希表中的键值对提取出来
- 按照分数从高到低排序
- 输出排序后的结果
这种解法的时间复杂度主要取决于排序步骤,为O(n log n),其中n是不同的分数个数。
2.2 优化解法探讨
考虑到分数通常是有限范围内的整数(比如0-100分),我们可以使用更高效的计数排序方法:
- 初始化一个大小为101的数组(假设分数范围是0-100)
- 遍历所有学生成绩,在对应分数位置计数
- 从高分到低分遍历数组,输出非零的分数及其计数
这种解法的时间复杂度是O(n),空间复杂度是O(1)(因为数组大小固定),效率更高。
3. 代码实现与细节处理
3.1 C++实现示例
cpp复制#include <iostream>
using namespace std;
int main() {
int n, score;
int count[101] = {0}; // 初始化所有分数计数为0
cin >> n;
for(int i = 0; i < n; i++) {
cin >> score;
count[score]++;
}
bool first = true;
for(int i = 100; i >= 0; i--) {
if(count[i] > 0) {
if(!first) cout << " ";
