1 条题解
-
0
题目分析
这道题目要求我们统计一段英文文本中每个单词出现的次数,并输出恰好出现指定次数 ( n ) 的所有单词。单词由字母组成,不区分大小写,且单词之间由非字母字符分隔。我们需要处理多个测试用例,每个用例以
EndOfText
结束。方法思路
- 输入处理:逐行读取输入文本,直到遇到
EndOfText
为止。 - 单词提取和标准化:对于每一行,将所有非字母字符替换为空格,并将所有字母转换为小写,以便统一处理。
- 单词统计:使用
stringstream
以空格为分隔符分割单词,并用map<string, int>
统计每个单词的出现次数。 - 结果输出:遍历统计后的
map
,输出所有出现次数恰好为 ( n ) 的单词,按字典序排列。如果没有这样的单词,输出提示信息。
解决代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> #include<sstream> #include<algorithm> using namespace std; map<string,int>a; int main() { int n,flag=0,i,flag1; string s; while(~scanf("%d",&n)) { a.clear(); if(flag==0) { flag=1;//在第2次以及以后的输入n之后都要先输出一个空行 } else if(flag==1) { printf("\n"); } while(getline(cin,s))//逐行读取 { if(s=="EndOfText") break; else { for(i=0;i<s.size();i++) { if(isalpha(s[i])) s[i]=tolower(s[i]); else s[i]=' ';/*这里一定要注意不是字母的就一定要变成空格 不然其他字符出现了n次也会输出*/ } } stringstream s1(s); string s2; while(s1>>s2)//以空格为边界 { a[s2]++; } } flag1=0;//标记有没有出现过n次的单词 for(map<string,int>::iterator it=a.begin();it!=a.end();it++) { if(it->second==n) { flag1=1; cout<<it->first<<endl; } } if(flag1==0) printf("There is no such word.\n");//表示没有这样的单词 } return 0; }
- 输入处理:逐行读取输入文本,直到遇到
- 1
信息
- ID
- 1551
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者