ZeroJudge C012: Tell me the frequencies!

題目敘述

本題採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";
        }
    }
}

留言

這個網誌中的熱門文章

ZeroJudge M933: 邏輯電路

ZeroJudge A148: You Cannot Pass?!

ZeroJudge A263: 日期差幾天