ZeroJudge C012: Tell me the frequencies!

給你一列文字,請你找出各字元出現的次數。

範例測資

範例輸入範例輸出
EOF 輸入,每筆測試資料一列。每列最大長度為1000。對每一列輸入,請輸出各字元的 ASCII 值及其出現的次數。請根據出現的次數由小到大輸出。如果有 2 個以上的字元有相同的次數,則 ASCII 值較大的先輸出。測試資料間請空一列
AAABBC
122333
67 1
66 2
65 3

49 1
50 2
51 3

解題思路

因為會有空格所以要用 Getline 來做輸入,可以使用 Map 來紀錄每一個字元出現的次數

做完次數的判斷之後使用 Auto 跑 Map 的 For迴圈,並且再建立一個存答案的 MapKey 是出現的次數,值是一個 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

發佈留言