ZeroJudge E973: 滿意度調查 (Survey of Satisfaction)

題目敘述

每筆輸入有一行整數,要求將每個出現的數字由大到小排序 (使用該數字的出現次數排序) 並輸出,如該數字沒有出現則不需輸出。


範例輸入 #1

2425264426558

範例輸出 #1

2 4 5 6 8


範例輸入 #2

1234567891011121314

範例輸出 #2

1 2 3 4 0 5 6 7 8 9


解題思路

使用「EOF」收「字元」的方式收資料,這樣子一次只會收一個字元不需要使用long long int或是string+stringstream來處理資料,當收到字元時使用MAP將該數字出現的次數+1。接下來可以使用while (true)迴圈來做輸出判定。每次while迴圈中跑一個For迴圈來確認目前MAP中最大值的數字為多少,並將其輸出且把該數字的MAP值設為0。當所有大於0的MAP值都輸出過之後就將While迴圈break掉,最後換行即可。

解題程式碼如下 (僅供參考):

#include <iostream>
#include <map>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    map<int, int>MAP;
    char ch;
    while (cin >> ch)
    {
        MAP[int(ch - '0')]++;
    }
    while (true)
    {
        int max = -999;
        int max_num;
        for (int i = 0; i<10; i++)
        {
            if (MAP[i] > max)
            {
                max = MAP[i];
                max_num = i;
            }
        }
        if (max <= 0)
        {
            break;
        }
        else
        {
            cout << max_num << " ";
            MAP[max_num] = 0;
        }
    }
    cout << "\n";
}

留言