版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/89927887
输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,要求能识别英文句号和逗号,即是说单词由空格、句号和逗号隔开。
输入有若干行,总计不超过1000个字符。
输出格式参见样例。
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
我一开始的思路是:先把字符串中的字母全部转换成小写,用map来记录单词出现的次数,利用字符流来进行单词的读入,然后进行无脑输出即可。然而!提交之后有测试点WA啦!因为我没有考虑到标点符号的问题,比如:"This is a dog, and that is also a dog."这个句子。我们预期的输出应该包括"dog:2",然而实际的输出结果是"dog,:1"和"dog.:1"。不要慌!
不要慌问题不大!通过观察可以发现' '、','、'.'这三个字符都标志着一个单词的结束,所以我们可以用一个字符串word来读取单词,然后无脑遍历字符串str,当读到那三个字符时,立即m[word]++;并把word重新置为空,否则将字符添加到word中。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str,word;
getline(cin,str);
transform(str.begin(),str.end(),str.begin(),::tolower); //把字符串全部转换成小写
stringstream ss;
ss << str; //将字符串str存入字符流中
map<string,int> m; //map的key为单词,value为这个单词出现的次数
while(ss >> word)
{
m[word]++;
}
for(auto it = m.begin(); it != m.end(); it++)
{
cout << it->first << ":" << it->second << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str, word = "";
getline(cin,str);
transform(str.begin(),str.end(),str.begin(),::tolower); //把字符串全部转换成小写
map<string,int> m; //map的key为单词,value为这个单词出现的次数
for(auto it : str)
{
if(it == ' ' || it == ',' || it == '.') //标志着一个单词的结束
{
if(word != "")
{
m[word]++;
}
word = ""; //将word置为空,开始记录下一个单词
}
else
{
word += it;
}
}
for(auto it = m.begin(); it != m.end(); it++)
{
cout << it->first << ":" << it->second << endl;
}
return 0;
}