給你一列文字,請你找出各字元出現的次數。
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每筆測試資料一列。每列最大長度為1000。 | 對每一列輸入,請輸出各字元的 ASCII 值及其出現的次數。請根據出現的次數由小到大輸出。如果有 2 個以上的字元有相同的次數,則 ASCII 值較大的先輸出。測試資料間請空一列 |
AAABBC 122333 | 67 1 66 2 65 3 49 1 50 2 51 3 |
解題思路
因為會有空格所以要用 Getline 來做輸入,可以使用 Map 來紀錄每一個字元出現的次數。
做完次數的判斷之後使用 Auto 跑 Map 的 For迴圈,並且再建立一個存答案的 Map,Key 是出現的次數,值是一個 Vector 用來存多個字元並且做排序。
每次將答案 Map 的 Vector 進行 Assign 到一個暫存Vector上並且將目前的字元做 Push_Back 到這個暫存的Vector中,然後進行Sort的排序,最後將暫存的Vector重新Assign回答案Map中的值。
最後一樣用 Auto 跑答案 Map 的 For迴圈,裡面再跑 Map 值中的 Vector 的For迴圈,輸出字元的 Ascii Code 即可。
範例程式碼-ZeroJudge C012: Tell me the frequencies!
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
string str;
while (getline(cin, str))
{
map<int, int>MAP;
for (int i = 0; i<str.length(); i++)
{
MAP[float(str[i])]++;
}
map<int, vector<int>>ans;
for (auto it:MAP)
{
vector<int>tmp;
tmp.assign(ans[it.second].begin(), ans[it.second].end());
tmp.push_back(it.first);
sort(tmp.begin(), tmp.end());
reverse(tmp.begin(), tmp.end());
ans[it.second].assign(tmp.begin(), tmp.end());
}
for (auto it:ans)
{
vector<int>tmp = it.second;
for (int i = 0; i<tmp.size(); i++)
{
cout << tmp[i] << " " << it.first << "\n";
}
cout << "\n";
}
}
}
//ZeroJudge C012
//Dr. SeanXD