题目描述
输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,要求能识别英文句号和逗号,即是说单词由空格、句号和逗号隔开。
输入描述:
输入有若干行,总计不超过1000个字符。
输出描述:
输出格式参见样例。
示例1
输入
A blockhouse is a small castle that has four openings through which to shoot.
输出
a:2
blockhouse:1
castle:1
four:1
has:1
is:1
openings:1
shoot:1
small:1
that:1
through:1
to:1
which:1
这题我开始用的是vector,因为用习惯了,我知道用map会更方便,因为map存储的顺序好像就是字符串的大小顺序,于是借这个机会我也学习一下map,把两个都写出来。
但是两者划分单词的方法都是一样的,要注意的几个问题:
1.我开始是直接用的cin>>s,接收每一个字符串,然后每次接收一个存一次,后来发现了一个问题就是当",and"就是符号和字母连在一起的情况。没办法只能一个字符一个字符的读取了
2.读取字符时按要求的字符划分成一个个单词,字符的拼接直接用+
3.注意大小写的转化(其实一般有大小写,就暗示着你要以字符为单位读取了)
vector
先上带码:
bool cmp(string a,string b){
return a<b;
}
int main(){
string s;
vector<string> vec;
getline(cin,s);
int i=0;
string str="";
while(i<s.size()){
if(s[i]==' '||s[i]=='.'||s[i]==','){
if(str!=""){
vec.push_back(str);
str="";
}
}else{
if(s[i]<='Z'&&s[i]>='A'){
s[i]=char(s[i]-'A'+'a');
}
str=str+s[i];
}
i++;
}
sort(vec.begin(),vec.end(),cmp);
int j=0;
while(j<vec.size()){
int z=j+1;
while(z<vec.size()&&vec[j]==vec[z]) z++;
cout<<vec[j]<<':'<<z-j<<endl;
j=z;
}
}
1.把每个单词都存储下来,然后按字符串的顺序排序,sort加自定义的函数cmp
2.再读取,相同的单词计数
总的来说较麻烦
map
int main(){
map<string ,int> m;
map<string ,int>::iterator it;
string s;
getline(cin,s);
int i=0;
string str="";
while(i<s.size()){
if(s[i]==' '||s[i]=='.'||s[i]==','){
if(str!=""){
m[str]++;
str="";
}
}else{
if(s[i]<='Z'&&s[i]>='A'){
s[i]=char(s[i]-'A'+'a');
}
str=str+s[i];
}
i++;
}
for(it=m.begin();it!=m.end();it++){
cout<<it->first<<":"<<it->second<<endl;
}
}
1.定义一个map<string,int> m和一个迭代器map<string,int>::iterator it
2.这里赋值map[str]如果有就+1,没有的话就会自动生成一个键值对,初始化为0,然后还是可以+1
3.map的访问for(it=m.begin();it!=m.end();it++)
cout<first<<":"<second<<endl;
本文介绍了一种使用Map数据结构统计英文句子中单词出现频率的方法,对比了使用vector和map的不同实现方式,详细解释了如何处理大小写、特殊字符及单词划分等问题。
2602

被折叠的 条评论
为什么被折叠?



