CPE 一顆星選集 49 道必考題
題目連結:https://zerojudge.tw/ShowProblem?problemid=c044
內容
給定多列文字,計算英文字母出現次數(大小寫視為相同),按照次數排序(若一樣則按照字母序)。
第一列有一個正整數 n ,代表有 n 列文字。
範例輸入
3
This is a test.
Count me 1 2 3 4 5.
Wow!!!! Is this question easy?
範例輸出
S 7
T 6
I 5
E 4
O 3
A 2
H 2
N 2
U 2
W 2
C 1
M 1
Q 1
Y 1
想法
使用 getline 一次讀取一列,遍歷判斷是否為字母。
開 struct 紀錄各個字母和出現次數,按照題目要求排序。
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <bits/stdc++.h> #define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr) using namespace std;
struct Node{ int num; int time; }; bool cmp(Node a, Node b){ if(a.time == b.time) return a.num < b.num; return a.time > b.time; } int main(){ fastio; int n; string s; Node node[26]; for(int i = 0; i < 26; ++i){ node[i].num = i; node[i].time = 0; } cin >> n; cin.ignore(); while(n--){ getline(cin, s); for(int i = 0; i < s.length(); ++i){ if(isalpha(s[i])){ if(isupper(s[i])){ ++node[s[i] - 'A'].time; } else ++node[s[i] - 'a'].time; } } } sort(node, node + 26, cmp); for(int i = 0; i < 26; ++i){ if(node[i].time == 0) break; else cout << char(node[i].num + 'A') << " " << node[i].time << "\n"; } }
|