【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】
在面試環節中,有一道題目也是考官們中意的一道題目:如果統計一段由字符和和空格組成的字符串中有多少個單詞?
其實,之所以問這個題目,考官的目的就是想了解一下你對狀態機了解多少。
(1) 題目分析
從題目上看,如果對一個字符串進行處理,那麼可以有下面幾種情形:初始狀態,字符狀態,空格狀態,結束狀態。那麼這幾種狀態之間應該怎麼遷移呢?
初始狀態: 如果輸入符號是空格,那麼進入空格狀態;如果是字符,那麼就進入字符狀態,同時單詞個數+1;如果是結束狀態,那麼直接返回;
字符狀態:如果輸入符號是空格,那麼進入空格狀態;如果是字符,那麼什麼也不做;如果是結束,直接返回;
空格狀態:如果輸入符號是空格,那麼什麼也不做;如果是字符,那麼進入字符狀態,同時單詞個數+1;如果結束狀態,那麼直接返回。
/* 輸入是字符
* --------> 字符狀態----------
* | | -->
* 初始狀態 輸入字符 | | 輸入空格 結束狀態
* | -->
* ---------> 空格狀態----------|
* 輸入是空格
*/
/* 輸入是字符
* --------> 字符狀態----------
* | | -->
* 初始狀態 輸入字符 | | 輸入空格 結束狀態
* | -->
* ---------> 空格狀態----------|
* 輸入是空格
*/
(2)根據上面描述的狀態遷移過程,編寫對應的代碼
typedef enum{
INIT_STATE = 1,
WORD_STATE,
SPACE_STATE,
};
int count_word_number(const char* pStr)
{
int count = 0;
int state = INIT_STATE;
char value ;
if(NULL == pStr)
return 0;
while(value = *pStr++){
switch (state)
{
case INIT_STATE:
if(' ' != value)
count ++, state = WORD_STATE;
else
state = SPACE_STATE;
break;
case WORD_STATE:
if(' ' == value)
state = SPACE_STATE;
else if('\0' == *pStr)
return count;
break;
case SPACE_STATE:
if(' ' != value)
count ++, state = WORD_STATE;
else if('\0' == *pStr)
return count;
break;
default:
break;
}
}
return count;
}
typedef enum{
INIT_STATE = 1,
WORD_STATE,
SPACE_STATE,
};
int count_word_number(const char* pStr)
{
int count = 0;
int state = INIT_STATE;
char value ;
if(NULL == pStr)
return 0;
while(value = *pStr++){
switch (state)
{
case INIT_STATE:
if(' ' != value)
count ++, state = WORD_STATE;
else
state = SPACE_STATE;
break;
case WORD_STATE:
if(' ' == value)
state = SPACE_STATE;
else if('\0' == *pStr)
return count;
break;
case SPACE_STATE:
if(' ' != value)
count ++, state = WORD_STATE;
else if('\0' == *pStr)
return count;
break;
default:
break;
}
}
return count;
}
(3)編寫測試用例,驗證代碼是否編寫正確
void test()
{
assert(0 == count_word_number(NULL));
assert(0 == count_word_number(""));
assert(1 == count_word_number("hello"));
assert(3 == count_word_number("china baby hello"));
}
void test()
{
assert(0 == count_word_number(NULL));
assert(0 == count_word_number(""));
assert(1 == count_word_number("hello"));
assert(3 == count_word_number("china baby hello"));
}
總結:
1)狀態機是編程人員的基本功,它和另外一種方法回調函數注冊一樣,使我們在日常開發中經常用到的一種方法
2)狀態機是計算機網絡通信的重要內容,想要對tcp-ip協議棧加深了解的朋友尤其需要重點掌握