牛客 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] ++;
            }
            
        }
        else
            str_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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值