week2-[一维数组]出现次数
week2-[一维数组]出现次数
题目描述
给定 NNN 个整数A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN。请求出这 NNN 个数中出现次数最多的数的出现次数,以及出现次数最少的数的出现次数。
输入格式
读入包括 222 行。第一行只有 111 个整数 NNN,表示数的个数。第二行包括 NNN 个整数 A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN。
输出格式
输出只有 111 行,包括两个恰好用一个空格隔开的整数,分别表示 A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN 中出现次数最多的数的出现次数,以及出现次数最少的数的出现次数。
样例 #1
样例输入 #1
5
3 6 2 5 2
样例输出 #1
2 1
样例 #2
样例输入 #2
8
10 10 10 10 10 10 10 10
样例输出 #2
8 8
样例 #3
样例输入 #3
7
2 3 2 4 2 3 4
样例输出 #3
3 2
提示
样例解释1
3,6,2,5,23, 6, 2, 5, 23,6,2,5,2 中 222 出现了 222 次,3,5,63,5,63,5,6 各出现了 111 次。因此出现次数最多的数出现了 222 次,出现次数最少的数出现了 111 次。
样例解释2
10,10,10,10,10,10,10,1010,10,10,10,10,10,10,1010,10,10,10,10,10,10,10 中只有 101010 这一种数字,其出现了 888 次,因此出现次数最多的数和出现次数最少的数的出现次数都是 888 次。
样例解释3
2,3,2,4,2,3,42,3,2,4,2,3,42,3,2,4,2,3,4 中 222 出现了 333 次,333 和 444 各出现了 222 次。因此出现次数最多的数出现了 333 次,出现次数最少的数出现了 222 次。
数据范围
对于所有数据,1≤N≤1000,0≤Ai≤1001 \le N \le 1000, 0 \le A_i \le 1001≤N≤1000,0≤Ai≤100。
1. 阅读题目
- 输入:
- NNN:数的个数
- NNN 个整数:A1,A2,…,ANA_1, A_2, \ldots, A_NA1,A2,…,AN
- 输出:
- 两个数,中间空格隔开:
- 出现次数最多的数的出现次数
- 出现次数最少的数的出现次数
- 两个数,中间空格隔开:
2. 分析问题
题目范围:
- N≤1000N \le 1000N≤1000,Ai≤100A_i \le 100Ai≤100。
👉 数据量小,可以直接用 频率统计数组。
思路:
- 建立一个频率数组
cnt[101]
(因为 Ai≤100A_i \le 100Ai≤100)。 - 遍历 AiA_iAi,统计每个数字出现的次数。
- 找到
cnt
中的最大值和最小值(注意:只考虑出现过的数字)。 - 输出这两个值。
3. C++ 代码实现
#include <iostream>
using namespace std;int main() {int N;cin >> N;int cnt[101] = {0}; // 用来统计出现次数for (int i = 0; i < N; i++) {int x;cin >> x;cnt[x]++;}int maxCnt = 0, minCnt = N + 1;for (int i = 0; i <= 100; i++) {if (cnt[i] > 0) { // 只考虑出现过的数字if (cnt[i] > maxCnt) maxCnt = cnt[i];if (cnt[i] < minCnt) minCnt = cnt[i];}}cout << maxCnt << " " << minCnt << "\n";return 0;
}
4. 示例运行
输入:
7
2 3 2 4 2 3 4
输出:
3 2
✅ 总结
- 用数组
cnt
统计每个数字的出现次数。 - 只在
cnt[i] > 0
时更新最大值/最小值。 - 时间复杂度 O(N+100)O(N + 100)O(N+100),足够快。