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),足夠快。