同題:UVa 11577 – Letter Frequency
我們對一個問題有興趣,到底在這行文字中頻率最高的字母是什麼?
可以忽略一些非字母的文字,要注意的是若是出現了A大寫字母跟a小寫都算是a。
範例測資
範例輸入 | 範例輸出 |
---|---|
第一個是代表有幾個測試資料。 一行就是一個測試資料,這一行可能有空白,但是至少有一個字母,一行全部的字母加起來不超過 200 個 | 對每個測試資料,輸出頻率最高的小寫字母。(如果超過兩個一樣,請字典由小排到大) |
1 Computers account for only 5% of the country’s commercial electricity consumption. | co |
解題思路
先將每個字母出現的次數存放到一個 Map 中,接下來用 Auto 跑這個 Map 的 For迴圈,並且再開一個新的 Map (Key是int,Value是Vector)。
將舊的 Map 中的值乘以 -1 當作是新的 Map 的Key,並將字元 Push_Back 到新的 Map 的 Value 中。
之後一樣用 Auto 跑新的 Map 的 For迴圈,先將 Vector 進行排序後將裡面的字母輸出,然後就可以Break這個For迴圈因為只要輸出最多次數的字母而已。
範例程式碼-ZeroJudge D267: Letter Frequency
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
string a;
getline(cin, a);
for (int i = 0; i<N; i++)
{
string str;
getline(cin, str);
map<char, int>MAP;
for (int j = 0; j<str.length(); j++)
{
if (isalpha(str[j]))
{
MAP[tolower(str[j])]++;
}
}
map<int, vector<char>>ans;
for (auto it:MAP)
{
ans[it.second * -1].push_back(it.first);
}
for (auto it:ans)
{
sort(it.second.begin(), it.second.end());
for (int j = 0; j<it.second.size(); j++)
{
cout << it.second[j];
}
cout << "\n";
break;
}
}
}
//ZeroJudge D267
//Dr. SeanXD