zoukankan      html  css  js  c++  java
  • 杭电2072 单词数

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

      题目要点:

      1.求的是不同的单词数目,不是单纯的单词数目;

      2.输入的字符串中,单词和单词之间可能有一个或者多个空格要注意筛掉这些空格,再计数。

      这题我用了两种思路去ac。一种好理解,但代码麻烦,另一种代码很简单,但需要很多预备知识。

      第一种,直接求:(参考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;
    }

    另一种,利用了stringstream,它构造字符串流的时候,空格会成为字符串参数的内部分界,所以就可以以此来抓取string中的单词。

    不懂的参考博文:http://www.usidcbbs.com/read-htm-tid-1898.html

    然后《c++ primer plus》p789 

    奉上代码:

    #include <iostream>
    #include<math.h>
    #include <iomanip>
    #include<cstdio>
    #include<string>
    #include<map>
    #include<vector>
    #include<list>
    #include<algorithm>
    #include<stdlib.h>
    #include<iterator>
    #include<sstream>
    using namespace std;
    
    
    int main()
    {
        string input;
        while(getline(cin,input))
        {
            if(input[0]=='#')
            {
                break;
            }
        stringstream str(input);//利用字符串流初始化对象
        string word;
        int word_num=0;
        map<string,int> diff_word;//利用map key-value的唯一性质 来找不同的单词
        while(str>>word)
        {
            diff_word[word]++;//没次如果有重复的单词,那个单词的value会++而key值(也就是单词本身不会变化)
        }
        cout<<diff_word.size()<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    IIS卸载
    WebView个人总结
    在服务器解决get方法的乱码
    弹出小窗口,PopupWindow的使用
    调用系统的媒体音量控制显示
    自定义ImageButton,实现快进快退功能
    【原创】在Android系统下实现抓词
    解决android客户端显示中文乱码问题
    Tab添加左右按钮
    Ramdisk源代码详解
  • 原文地址:https://www.cnblogs.com/William-xh/p/6863311.html
Copyright © 2011-2022 走看看