本文参考:杭电-2072 和 C++中set用法详解
题目
统计一篇文章里不同的单词总数
要求
输入:有多组数据,每组一行,每行是一篇小文章。文章由小写字母和空格组成,没有标点,遇到#时结束输入
输出:每组只输出一个整数,单独成行,整数代表不同单词的总数
样例
样例输入:you are my friend
#
样例输出:4
题目看完了会不会发现很简单,但是如果不用容器还会简单吗?肯定没有用容器简单呀!但我还是尝试了,大家要和我一样每一题都认真的思考,然后大胆的去尝试,实在想不出来再从网上找,再把知识点弄明白,后期再多拿出来复习,然后它就是你了。好了,说说我的初生代代码吧!
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i, j, k, p, q,z;
string words,word1,word2;
int x[10000];
while (getline(cin, words))
{
int y[10000]={0};
i = j = k = 0;
if(words[i]=='#')
break;
while (i<=words.size()) //计算出单词个数k
{
if (words[i] == ' ' || words[i] == '\0')
{
x[k++] = j;
j = -1;
}
i++;
j++;
}
p=q=z=0;
for (i = 0; i < k; i++) //用冒泡的方式对比字符串算出重复的单词数z
{
word1=words.substr(p,p+x[i]);//循环取单词,此处没有考虑连续空格的情况,所以错误
p+=x[i]+1;
q=p;
for (j = i + 1; j < k; j++) //将提取的单词对比字符串的单词
{
if (x[i] == x[j])
{
y[j]=1;
word2=words.substr(q,q+x[j]);
if(word1.substr(0)==word2.substr(0))
z++;
}
q+=x[j]+1;
}
}
cout << k-z << endl; //输出最终单词数
}
return 0;
}
这个代码是真的烂,没有考虑到会有连续空格出现以及开头和结尾会是空格的情况。当写完调试的时候发现自己调试的样例都过不掉,我就不想再改了,实在是太麻烦了。所以我就看到了这个 杭电-2072 就是开头的参考文章,发现要用到set容器,于是就看到了这个 C++中set用法详解 ,讲解的很详细,不会的小伙伴建议看看。不知道string库里的substr的用法的可以看:C++中substr()函数用法详解 。我可以说我直接抄下来了吧:
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main()
{
int i,j,k;
string words,word;
while(getline(cin, words)&&words[0]!='#')
{
set<string>s;
word="";
for(i=0;i<words.size();i++)
{
if(words[i]==' ') //当遇到空格时将单词存入s中
{
if(word!="") //单词为空时不存储
{
s.insert(word);
word="";
}
}
else
{
word+=words[i];
}
}
if(word!="")
{
s.insert(word);
}
cout << s.size() << endl;
}
}
此代码应该比较好理解,只用到了set容器的插入(insert)和计数(size)。简单说一下,插入就是把要插入的变量内容放到容器的节点结构里,计数就相当于库函数一样直接调用。此外我还看到了使用map容器做这一题的,先将多余的空格处理掉,并且将其放入map容器中,然后再判断容器中的单词是否重复。可以看这篇:杭电2072单词数(题解+代码) map容器可以看这篇:C++map用法总结(整理)
今天是工具人的一天,这么短的文章有这么多其他博主的文章链接,只有不断变强才能让自己的文章链接出现在其他博主的文章里,加油!