1. 题目解析与解题思路
PAT乙级1038题是一道典型的统计查询类题目,题目要求我们统计一组数据中各个数字出现的次数,然后根据查询输出指定数字的出现次数。这类题目在实际编程竞赛和面试中经常出现,考察的是基础数据结构和算法的应用能力。
1.1 题目核心需求
题目可以分解为两个主要部分:
- 输入一组数字,统计每个数字出现的次数
- 接收一系列查询,输出每个查询数字的出现次数
这种"统计+查询"的模式在实际开发中非常常见,比如网站访问量统计、商品销量统计等场景。
1.2 解题思路选择
面对这个问题,我们有几个可能的解决方案:
- 暴力搜索法:对于每个查询,遍历整个数组统计次数。时间复杂度O(n*k),当n和k较大时效率很低。
- 排序+二分查找:先排序,然后用二分查找确定数字范围。时间复杂度O(nlogn + klogn)。
- 哈希表法:使用哈希表记录每个数字的出现次数。时间复杂度O(n+k),是最优解。
显然,哈希表法是最佳选择。在C++中,我们可以直接用数组来实现简单的哈希表,因为题目中数字范围不大(题目未明确说明,但PAT乙级题目通常数字范围在合理范围内)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现详解
2.1 基础数据结构选择
cpp复制vector<int> v(100002);
这里选择了一个大小为100002的vector作为哈希表。选择这个大小的考虑是:
- 题目没有明确给出数字范围,但PAT乙级题目通常数字不会太大
- 100002足够覆盖常见情况,且不会占用过多内存
- 比常见的100000稍大一些,避免可能的边界问题
注意:在实际比赛中,如果题目给出了明确的数字范围,应该根据题目要求调整数组大小。如果没有给出,选择一个合理的安全范围。
2.2 输入处理部分
cpp复制cin >> n;
for(int i = 0; i < n; i++) {
cin >> num;
v[num]++;
}
这部分代码完成了统计工作:
- 首先读取数字的总数n
- 然后循环n次,每次读取一个数字并在哈希表中对应位置计数
时间复杂度是O(n),这是不可避免的,因为必须遍历所有输入数字。
2.3 查询处理部分
code复制
