统计单词出现的次数
题目链接
题目要求中有:“排序单词时,先比较它们的出现次数,出现次数高的排名在前,若出现次数一样,则按照字典序排序”。
不知道怎么直接对map进行排序,所以先把map中元素换到能排序的容器中,用了vector+pair的形式,也可以用vector+自定义结构体的方式。
#include <iostream>
#include <map>
#include <cstring>
#include <unordered_map>
#include <algorithm>
#include <vector>
using namespace std;
unordered_map<string,int> mp;
bool cmp(pair<string,int> &a,pair<string,int> &b){
if(a.second!=b.second) return a.second > b.second;
else return a.first < b.first;
}//自定义排序函数
int main(){
string s;
vector<pair<string,int> > v;
//printf("%d %d\n",'A','a');
while(cin >> s){
for(int i = 0;i < s.size(); ++i){
if(s[i] >= 'A' && s[i] <= 'Z') s[i] += 32;
}//将大写字母全部转换为小写。
mp[s]++;
}
for(auto &it:mp){
v.push_back(it);
}
sort(v.begin(),v.end(),cmp);//排序
cout << mp.size() << "\n";
int i = 0;
for(auto it = v.begin();it < v.end(); it++){
cout << it->first << " " << it->second << "\n";
i++;
if(i==5) break;//题目只要求输出前五个
}
return 0;
}
丑陋的代码