• 一步一步写算法(之单词统计)


    转自:http://blog.csdn.net/feixiaoxing/article/details/6871294

    在面试环节中,有一道题目也是考官们中意的一道题目:如果统计一段由字符和和空格组成的字符串中有多少个单词?

        其实,之所以问这个题目,考官的目的就是想了解一下你对状态机了解多少。

        (1) 题目分析

        从题目上看,如果对一个字符串进行处理,那么可以有下面几种情形:初始状态,字符状态,空格状态,结束状态。那么这几种状态之间应该怎么迁移呢?

        初始状态: 如果输入符号是空格,那么进入空格状态;如果是字符,那么就进入字符状态,同时单词个数+1;如果是结束状态,那么直接返回;

        字符状态:如果输入符号是空格,那么进入空格状态;如果是字符,那么什么也不做;如果是结束,直接返回;

        空格状态:如果输入符号是空格,那么什么也不做;如果是字符,那么进入字符状态,同时单词个数+1;如果结束状态,那么直接返回。

    1. /*          输入是字符 
    2. *           -------->    字符状态 ---------- 
    3. *          |                               | --> 
    4. *      初始状态  输入字符  |  |  输入空格            结束状态 
    5. *          |                                 --> 
    6. *          --------->    空格状态 ----------| 
    7. *            输入是空格 
    8. */  


        (2)根据上面描述的状态迁移过程,编写对应的代码

    1. typedef enum{  
    2.     INIT_STATE = 1,  
    3.     WORD_STATE,  
    4.     SPACE_STATE,  
    5. };  
    6.   
    7. int count_word_number(const char* pStr)  
    8. {  
    9.     int count = 0;  
    10.     int state = INIT_STATE;  
    11.     char value ;  
    12.   
    13.     if(NULL == pStr)  
    14.         return 0;  
    15.   
    16.     while(value = *pStr++){  
    17.         switch (state)  
    18.         {  
    19.         case INIT_STATE:  
    20.             if(' ' != value)  
    21.                 count ++, state = WORD_STATE;  
    22.             else  
    23.                 state = SPACE_STATE;  
    24.             break;  
    25.   
    26.         case WORD_STATE:  
    27.             if(' ' == value)  
    28.                 state = SPACE_STATE;  
    29.             else if('\0' == *pStr)  
    30.                 return count;  
    31.                   
    32.             break;  
    33.   
    34.         case SPACE_STATE:  
    35.             if(' ' != value)  
    36.                 count ++, state = WORD_STATE;  
    37.             else if('\0' == *pStr)  
    38.                 return count;  
    39.               
    40.             break;  
    41.   
    42.         default:  
    43.             break;  
    44.         }  
    45.     }  
    46.   
    47.     return count;  
    48. }  

        (3)编写测试用例,验证代码是否编写正确

    1. void test()  
    2. {  
    3.     assert(0 == count_word_number(NULL));  
    4.     assert(0 == count_word_number(""));  
    5.     assert(1 == count_word_number("hello"));  
    6.     assert(3 == count_word_number("china baby hello"));  
    7. }  

    总结:

        1)状态机是编程人员的基本功,它和另外一种方法回调函数注册一样,使我们在日常开发中经常用到的一种方法

        2)状态机是计算机网络通信的重要内容,想要对tcp-ip协议栈加深了解的朋友尤其需要重点掌握

  • 相关阅读:
    Linux链接库一(动态库,静态库,库放在什么路径下)
    scp指令的学习
    注册表语法
    汇编指令
    PS7.0快捷键和使用技巧
    Lrc歌词-开发标准
    VBS 创建快捷方式
    LDAP属性对照表
    按键精灵对VBS的支持
    英寸、磅等单位的换算
  • 原文地址:https://www.cnblogs.com/phoenixzq/p/2266031.html
Copyright © 2020-2023  润新知