链接:登录—专业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)
-
transform(strA.begin(), strA.end(), strA.begin(), ::tolower);
-
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);
}