map容器练习:使用map容器识别统计单词个数

题目链接:单词识别_牛客题霸_牛客网

对map的使用不太熟悉的同学可以参考:超详细介绍map(multimap)的使用-CSDN博客

题目解析

输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,次数一样的按照单词小写的字典序排序输出,要求能识别英文单词和句号

得到单词与其个数,我们会用到map容器。输出要求:个数多的先输出,个数相同按照字典序排序输出

算法分析

其实具体思路很简单,主要是对于map容器使用的练习

1.输入一个句子,依次得到单词,并使用map容器记录单词及其个数。

2.因为map是按照字典序排序的,所以我们需要按照单词个数重新排序,map本身是不支持sort,所以我们将map的数据放入vector中进行排序(pair本身是支持排序的,但是它支持的排序,并不是我们所需要的排序,所以我们要传入仿函数实现自己定义的排序)

3.排序完成我们输出结果即可

代码实现

cpp 复制代码
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;

struct compare
{
    bool operator()(const pair<string, int>& a, const pair<string, int>& b)
    {
        //当个数相同时,按照字典序排序
        if (a.second == b.second)
            return a.first < b.first;
        return a.second > b.second;
    }
};

int main()
{
    string in;
    getline(cin, in);
    //将单词存入数组
    vector<string> word;
    string tmp;
    for (auto& e : in)
    {
        if (e == ' ' || e == '.')
        {
            word.push_back(tmp);
            tmp.resize(0);
        }
        else
            tmp += e;
    }
    //使用map容器得到单词以及其个数
    map<string, int> ret;
    int num = 'a' - 'A';
    for (auto& r : word)
    {
        string e = r;
        if (r[0] >= 'A' && r[0] <= 'Z')
        {
            e[0] += num;
        }
        ret[e]++;
    }
    //放入vector进行排序
    vector<pair<string, int>> amd;
    for (auto& e : ret)
    {
        amd.push_back(e);
    }

    sort(amd.begin(), amd.end(), compare());

    for (auto& e : amd)
    {
        cout << e.first << ":" << e.second << endl;
    }
}

优化:可以直接将单词放入map,没必要多先放入vector再放入map

cpp 复制代码
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;

// operator()
struct compare
{
	bool operator()(const pair<string, int>& a, const pair<string, int>& b)
	{
		if (a.second == b.second)
            return a.first < b.first;
        return a.second > b.second;
	}
};

int main()
{
	string in;
	getline(cin,in);
	string tmp;
	map<string, int> ret;
	for (auto& e : in)
	{
		if (e == '.' || e == ' ')
		{
			ret[tmp]++;
			tmp.resize(0);
		}
		else
		{
			tmp += tolower(e);//大写转小写函数。小写转大写:toupper
		}
	}

	vector<pair<string, int>> n;
	for (auto& e : ret)
	{
		n.push_back(e);
	}
	sort(n.begin(), n.end(), compare());
	for (auto& e : n)
	{
		cout << e.first << ":" << e.second<<endl;
	}
}
相关推荐
LuminousCPP11 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.088899911 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
张小姐的猫12 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
AI算法沐枫12 小时前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归
один but you12 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
一只机电自动化菜鸟12 小时前
一建机电备考笔记(40) 建筑机电施工—排水管道施工(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计
你干嘛?哎哟13 小时前
4月工作笔记
笔记
tom021813 小时前
软考中级《嵌入式系统设计师》全套备考资料(真题 + 教材 + 笔记)
笔记·嵌入式·软考·自学·电子技术·电子资料·变成
MY_TEUCK13 小时前
【Java 后端 | Nacos 注册中心】微服务治理原理、选型与注册发现实战
java·开发语言·微服务
测试员周周13 小时前
【Appium 系列】第13节-混合测试执行器 — API + UI 的协同执行
开发语言·人工智能·python·功能测试·ui·appium·pytest