[NOIP2011]统计单词数(map)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )

输入描述:

共 2 行。
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出描述:

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数 -1。

Input

To
to be or not to be is a question


Output

2 0


*注:输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为0。

为了练习map函数,所以用的是map函数。

这道题的思路大致是,先输入,然后统一大小写,在存入map函数里边,再利用迭代器去寻找输入的那个单词。


首先是,关于map

map,可以理解为是一个数组一样的东西,其头文件为#include<map>

它的定义:map<type_key , type_value>name;

它有自动排序的功能,与之类似的,有一个unordered_map,其用法基本相同,不同点就是它的头文件为#include<unordered_map>,它没有自动排序的功能

其次,有需要注意的几个点:

1.输入时,cin在前,getline在后,中间需要加个cin.ignore(),其作用是忽略cin输入时所遗留的换行符,直接读取下一行的输入数据。

cin:遇空白格、换行符都会结束

getline:换行符为结束标志

2.用到了trainsform,可以把string类型实现大小写转换,其形式为(设string类型有str1,str2)

  1. transform(strA.begin(), strA.end(), strA.begin(), ::tolower);

  2. transform(strB.begin(), strB.end(), strB.begin(), ::toupper);

 tolower是统一换成小写,toupper是统一换成大写。

*注意:trainsform需要两个头文件,一个是#include<string>,一个是#include<algorithm>

3.substr函数是用来拆分字符串的函数,是string类型之一

用法为:substr(int a,int b).......a为开始截取的点,b为截取的个数

例如:string str1 = "Like you", str2;         str2 = str1.substr(0,4);

输出 str2 应该为 Like

4.迭代器在使用前一定一定要初始化

map<int, string>::iterator it;

此外,it->first指的是权值,it->second指的是权值的值。


代码如下:

#include<iostream>
#include<map>
#include<string>
#include<algorithm>//trainsform需要用到两个头文件,string&algorithm 
using namespace std;
int main()
{
	map<int,string>m1;
	string key,s;
	cin>>key;//cin遇空格,回车均会结束 
	cin.ignore();//这个可以忽略第一次输入所遗留的换行符,直接读取下一行输入的数据 
	getline(cin,s);//使用getline,整个句子直接输入 
	int sum=0;
	transform(s.begin(),s.end(),s.begin(),::tolower);
	//将s里边的字母全部转化为小写 
	transform(key.begin(),key.end(),key.begin(),::tolower);
	//把关键词key全部转化为小写字母 
	int d=0,n=0;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]==' ')
		{
			m1[sum]=s.substr(sum,i-sum);
			//substr函数是一个string类里边的拆分函数 
			//将s拆开存入map函数 
			sum=i+1;
			//例:i=2;->sum=3;
			//	  m1[3]=s,substr(3,-1); 
		}
	}
	m1[sum]=s.substr(sum);
	map<int,string>::iterator it;//迭代器的初始化 
	for (it = m1.begin(); it != m1.end(); it++)
	{
		
		if(it->second==key)
		{
			if(d==0)
			{
				d++;
				n=it->first;
			}
			else
				d++;	
		}
	}
	if(d==0)
		printf("-1\n");
	else
		printf("%d %d\n",d,n);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值