開啟章節選單
10008 What's Cryptanalysis?
題目敘述
將題目給定的字串中的字母進行加總並排序
輸入說明
- 輸入的第1列有一個正整數n,代表以下有多少列需要作分析的密文。
- 接下來的n列,每列含有0或多個字元(可能包含空白字元)
輸出說明
- 每列包含一個大寫字元(A~Z)和一個正整數。這個正整數代表該字元在輸入中出現的次數。
- 輸入中大小寫(例如:A及a)視為相同的字元。
- 輸出時請按照字元出現的次數由大到小排列,如果有2個以上的字元出現次數相同的話,則按照字元的大小(例如:A在H之前)由小到大排列。
- 如果某一字元未出現在輸入中,那他也不應出現在輸出中。
解題思路
將字母轉成大寫後加總並進行自訂排序
程式碼
#include <bits/stdc++.h> using namespace std; // 自訂排序:先依照出現次數遞減,再按字母順序遞增 bool LESS(pair<char, int>& a, pair<char, int>& b) { if (a.second != b.second) return a.second > b.second; return a.first < b.first; } int main() { int n; cin >> n; cin.ignore(); // 吃掉換行符 map<char, int> mp; // 統計字母次數 while (n--) { string s; getline(cin, s); // 讀一整行文字 for (int i = 0; i < s.size(); i++) { // 若為小寫則轉為大寫 if (s[i] >= 'a' && s[i] <= 'z') s[i] = toupper(s[i]); // 若為英文字母則統計 if (s[i] >= 'A' && s[i] <= 'Z') mp[s[i]]++; } } // 將 map 轉為 vector,方便排序 vector<pair<char, int>> vr(mp.begin(), mp.end()); sort(vr.begin(), vr.end(), LESS); // 排序 // 輸出 for (int i = 0; i < vr.size(); i++) { cout << vr[i].first << ' ' << vr[i].second << endl; } }