• map的一道题目<单词识别>


    最近学到了map,为了熟悉使用,找到了一道题目来练练手,题目为牛客网上:KY264 单词识别

    做题链接:单词识别_牛客题霸_牛客网 (nowcoder.com)

    目录

    题目:

    要求:

    样例:

    思路

    代码实现

    先实现字典序:

    实现按次数来的降序


    题目:

    要求:

    1. 将一句话中的单词按照出现次数降序排列

    2. 相同次数的单词,按照字典序排列(升序排列)

    3. 不区分大小写

    4. 要求能识别单词和句号

    5. 输入的一行为单词和句号,不考虑其他符号

    样例:

    样例中值得我们注意到的就是:

    开头的大写字母 A ,输出的时候是按照小写字母来的

    因此我们在输出时以小写为准----大写改小写

    思路

    1. 将一句话中的大写字母全部换成小写字母

    2. 将每个单词插入到map对象中,完成计数+字典序(默认为升序),符合要求

    3. 再以次数作为pair类型中的 key 值,单词作为 value 值,插入到 multimap 对象中,完成降序排列

    代码实现

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. string str;
    8. mapint> mp;
    9. while (getline(cin, str))
    10. {
    11. int slow = 0; //单词的起始下标
    12. string s; //存放单个单词
    13. for (int i = 0; i < str.size(); i++)
    14. {
    15. //大写变小写
    16. if ('A' <= str[i] && str[i] <= 'Z')
    17. {
    18. str[i] += 32;
    19. }
    20. //取单词放入mp中,插入+计数+自动降序排序
    21. if (str[i] == ' ' || str[i] == '.')
    22. {
    23. int num = i - slow; //单词大小
    24. s = str.substr(slow, num); //通过单词起始下标和大小取出来
    25. mp[s]++;
    26. slow = i + 1; //跳过空格到下一个单词的起始位置
    27. }
    28. }
    29. //上述已经按字典序排好了---下面将次数大的放在前面
    30. //注意次数出现相等,防止去重,要用multimap
    31. //手动更改为降序
    32. multimap<int, string, greater<int>> intsort;
    33. for (const auto& e : mp)
    34. {
    35. //插入+排序
    36. intsort.insert(make_pair(e.second, e.first));
    37. }
    38. for (const auto& e : intsort)
    39. {
    40. cout << e.second << ":" << e.first << endl;
    41. }
    42. }
    43. return 0;
    44. }

    分析上述如何实现:

    先实现字典序:

    创建 map 对象 mp,单词作为 pair 类型的 key 值,次数作为 pair 类型的 value 值

    输入一句话,while中用 getline 获取字符串,防止直接用 cin 遇到 ‘ ’ 直接停止获取

    s 存放单个单词、slow 记录每个单词的起始下标

    for 循环下标遍历,将大写字母全部换为小写

    遇到 ' ' 或者 ‘ . ’ ,说明前面一定有单词,这时候就可以将单词提取出来:

    单词相当于子串,我们用到 substr,num 为单词大小,slow为单词起始下标

    通过 i - slow,就可以算出单词大小 

    s 存储单词,用 s 将单词插入到 mp 中,并++,计数

    最后要更新下一个单词的起始位置 slow = i + 1,跳过空格到下一个单词的起始位置

    实现按次数来的降序

    这里用到 multimap ,multi 版本允许键值冗余,次数作为 pair 类型的 key 值,单词作为 pair 类型的 value 值

    将上述 pair 类型的键值对插入到 multimap 的对象中,完成排序

    注意:无论是map还是multimap,默认都是比较 key 值进行升序排列,现在要实现降序,需要手动改变仿函数

    multimap<int, string, greater<int>> intsort;

     将 mp 对象的 first 和 second 交换位置,构建 intsort 对象的 pair

    1. for (const auto& e : mp)
    2. {
    3. //插入+排序
    4. intsort.insert(make_pair(e.second, e.first));
    5. }

    插入完成,排序也就完成,此时 intsort 对象中存储的键值对就是我们需要输出的:

    1. for (const auto& e : intsort)
    2. {
    3. cout << e.second << ":" << e.first << endl;
    4. }

    按照样例的输出要求:单词在前,次数在后,输出整个内容,这个题目就完成了。 

  • 相关阅读:
    PASCAL VOC数据集格式文件夹下文件配置
    Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
    2.9 深入GPU硬件架构及运行机制
    基于nodejs的电影交流网站-计算机毕业设计
    雾锁王国服务器配置怎么选择?阿里云和腾讯云
    Ubuntu16.04搭建UbertoothOne环境
    JS动态加载数据绑定事件 jquery delegate() 方法
    基于云边协同架构的五大应用场景革新
    DPU网络开发SDK——DPDK(一)
    【100个 Unity实用技能】| 关于触发器互相检测的必要前提条件配置
  • 原文地址:https://blog.csdn.net/weixin_53316121/article/details/126150829