zoukankan      html  css  js  c++  java
  • 题解报告:hdu 2072 单词数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072

    题目:

    Problem Description
    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
    Input
    有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
    Output
    每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
    Sample Input
    you are my friend
    #
    Sample Output
    4
    解题思路:这道题的思路就是计数每一行不同单词的个数,由此想到set关联式容器(是一个集合,集合中元素具有不重复性),set是C++标准库中的一种关联容器。所谓关联容器就是通过键(key)来读取和修改元素。与map关联容器不同,它只是单纯键的集合。此题通过cin.get()函数来读取单个字符,每次读取单词的第一个字符,接下来循环读入字符保存在s字符串中,判断条件为当前字符不是空格和换行符;当不满足条件即输入完一个单词,这样通过s.length()来检查是否单词长度为0,不为0就可向容器中插入该单词,最后如果遇到' ',即该组已经输入完毕,就得输出有多少个单词数了。
    AC代码:
    解法一:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     set<string>st;//一个保存string的set集合
     6     string s;
     7     char c;
     8     while((c=cin.get())!='#'){//循环读入单词的第一个字符,直到不为'#'为止,控制文章
     9         s.clear();//清除要保存单词的s字符串
    10         while(c!=' '&&c!='
    '){//循环读取字符(为一个单词)
    11             s+=c;
    12             c=cin.get();//获取下一个字符
    13         }
    14         if(s.length())//表示如果此时string中s是有长度,就将s插入到容器中
    15             st.insert(s);
    16         if(c=='
    '){//遇到'
    '的话就是该输出个数和换行了
    17             cout<<st.size()<<endl;//输出容器的大小
    18             st.clear();//清除st容器
    19         }
    20     }
    21     return 0;
    22 }

     解法二:(C语言写法)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 char a[100001],b[2000][1000];//a数组要开大点,b数组用来保存每行的单词
     4 int main()
     5 {
     6     int i,j,k,g,t;
     7     while(gets(a)){
     8         if(strcmp(a,"#")==0)break;
     9         memset(b,0,sizeof(b));//清空
    10         i=j=k=0,g=strlen(a);
    11         while(i<g){//扫描每行的字符串
    12             if(a[i]==' '){
    13                 while(a[i]==' '&&a[i]!='')i++;//清空0字符
    14             }
    15             else{
    16                 while(a[i]!=' '&&a[i]!=''){
    17                     b[k][j]=a[i];//单个字符赋予二维数组
    18                     j++,i++;
    19                 }
    20                 b[k][j]='';//完整的字符串
    21                 k++,j=0;//下一个单词
    22             }
    23         }
    24         t=k;//表示总共有单词的个数
    25         for(i=0;i<k-1;i++){//循环比较
    26             for(j=i+1;j<k;j++){
    27                 if(strcmp(b[i],b[j])==0){
    28                     t--;//如果有相同的话t就减1
    29                     break;//跳出操作相当于删掉下标为i的单词,保留j位置的单词,因为后面还要用到j来与其后面的比较
    30                 }
    31             }
    32         }
    33         cout<<t<<endl;//输出单词个数
    34     }
    35     return 0;
    36 }
  • 相关阅读:
    计数
    表单验证
    获取位置
    jq事件
    jq选择器
    PHP超文本预处理器(通用开源脚本语言)
    文字超出两行显示省略号
    Vim配置:在win10下用vim编译运行C/C++(异步插件管理,一键运行)
    实验楼HTML基础入门学习
    博客园美化:添加目录,标题设置,代码高亮,主题设置
  • 原文地址:https://www.cnblogs.com/acgoto/p/8659589.html
Copyright © 2011-2022 走看看