題目敘述
每筆輸入有一行整數,要求將每個出現的數字由大到小排序 (使用該數字的出現次數排序) 並輸出,如該數字沒有出現則不需輸出。
範例輸入 #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";
}
留言
張貼留言