杭电ACM 2072:单词数
原创作品 转载请注明出处http://blog.csdn.net/always2015/article/details/45598799这一道题如果用最直接的方法要考虑的地方会比较多,但是这样做肯定是会AC的。我就是用这种方法。在我的代码里面最后用到了map容器,不熟悉的请看我的博文http://blog.csdn.net/always2015/article/details/44980187。我
·
原创作品 转载请注明出处http://blog.csdn.net/always2015/article/details/45598799
这一道题如果用最直接的方法要考虑的地方会比较多,但是这样做肯定是会AC的。我就是用这种方法。在我的代码里面最后用到了map容器,不熟悉的请看我的博文http://blog.csdn.net/always2015/article/details/44980187。我的AC代码如下,各段代码的含义我已经注释很清楚了:
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main(void)
{
//input_str存储整行字符串,words存储每个单词
string input_str,*words;
int lenght,flag=0,k=0,word_num=0;//word_num存储单词数
map<string,int> differ_word;//differ_word存储不同单词
while(getline(cin,input_str))
{
if(input_str=="#") break;//输入“#”就退出
lenght=input_str.size();
/*这个循环主要是求出单词数,
注意:输入的字符串可能开头,中间,结尾都有一个或者多个空格
这些都要考虑在内
*/
for(int i=0; i<lenght; i++)
{
//flag为判断标志,当判断第一个字符不为空时候,且flag为0时候开始计数
if(input_str[i]!=' '&&flag==0)
{
++word_num;
flag=1;//改变标志位的值,表示此时已经记过数了
continue;
}
if(flag==1)
{
//当flag==1说明已经即过数了。当碰到空的字符,说明这个单词已经扫描完成,重新置标志位flag
//因为当扫描到最后一个字符时候i==lenght-1,如果最后没有空格,也要重新置flag
if(input_str[i]==' '||i==lenght-1)
{
flag=0;
}
}
}
//为保存单词分配空间
words=new string[word_num];
/*下面一个for循环只要是保存字符串中的单词*/
for(int j=0; j<lenght; j++)
{
//当碰到的字符不为空则存储单词,注意这时候k的变化
if(input_str[j]!=' ')
{
words[k]+=input_str[j];
}
//碰到空字符的判断
if(input_str[j]==' ')
{
//如果最后一个字符为空则跳出循环
if(j==lenght-1) break;
/*如果空字符的下一个字符不为空,则下一个单词就是新的一个单词,k就加1
注意:当一个字符串开始时,有一个或者很多个空格时候,则k不能加1.因为会导致words[k]存储的是空字符
所以这里要判断当words[k],不为空时候k才加1
*/
if(input_str[j+1]!=' '&&words[k]!=" ")
++k;
}
}
//利用容器map统计单词不一样的个数
for(int h=0;h<word_num;h++)
{
++differ_word[words[h]];
}
//输出个数
cout<<differ_word.size()<<endl;
//下面变量必须重新初始化。方面下一次循环使用
word_num=0;
flag=0;
k=0;
differ_word.clear();//清空容器
}
return 0;
}
更多推荐
已为社区贡献1条内容
所有评论(0)