牛客 KY264 单词识别
输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,次数一样的按照单词小写的字典序排序输出,要求能识别英文单词和句号。
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
class Compare
{
public:bool operator()(const pair<const string, int>& a1, const pair<const string, int>& a2){return a1.second > a2.second || (a1.second == a2.second && a1.second < a2.second);//仿函数true是不改,所以>与<与降序/升序对应}
};
inline void switCapital(string& str)
{if (str[0] >= 'a' && str[0] <= 'z'){str[0] -= 32;}else{str[0] += 32;}
}
int main()
{vector<string> str;string mid_str;int i = 0;while (cin >> i){if (i == 9)break;}while (cin >> mid_str)//cin 1.空白符:读到空白符会停下,并将缓冲区的空白符抛弃,下一个继续读\2.cin会每次开始会重置变量,可以一直使用,自动清理{str.push_back(mid_str);if (mid_str.back() == '.'){str.back().erase(str.back().end() - 1, str.back().end());break;}//mid_str.clear();}map<string, int> str_map;for (string& _str : str){string str_mid(_str);switCapital(str_mid);if (str_map.find(str_mid) != str_map.end()){int times = (*(str_map.find(str_mid))).second;if (_str[0] >= 'a' && _str[0] <= 'z'){str_map.erase(str_mid);str_map[_str] += times + 1;}else{str_map[str_mid] ++;}}elsestr_map[_str]++;}vector<pair<string, int>> randvec;//为什么pair<const string,int>不行,sort那会报错不能=,因为sort交换时要用=复制,pair调用内部类型=,const string不允许//用其他容器接收map里的pair,用非const接收,除非不想复制/排序//map内部是会修饰成const key,vakue的randvec.reserve(str_map.size());for (pair<string, int> p : str_map){randvec.push_back(p);}sort(randvec.begin(), randvec.end(), Compare());//算法库的sort要随机迭代器的开始和结尾,一个比较器仿函数可传可不传,默认升序for (auto& p : randvec){cout << p.first << ":" << p.second << endl;}return 0;
}