題目敘述
本題採EOF方式收資料,每筆資料有一行字串 (字串中會有空格),要求輸出每一個字元出現的次數,字元的表示方式要用Ascii Code的方式輸出,每筆資料輸出中間要空一行。輸出的順序由出現次數小到大做輸出,如果有出現次數相同的字元,優先輸出Ascii Code較大的字元。
範例輸入 #1
AAABBC
122333
範例輸出 #1
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即可。
解題程式碼如下 (僅供參考):
#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";
}
}
}
留言
張貼留言