這是曾經的乙個面試題,正好引出狀態機程式設計思想。挺不錯的乙個例子。
給定乙個字串,它由以下字元組成:
該字串組成有以下規則限定:
請解決問題:
我們拿到這個問題時,第一感覺往往是順序遍歷字串,並檢測左右相鄰字元是否滿足邊界條件,從而進行分支處理。但是這樣做有以下棘手之處:
嗯,不信的話,可以自己按照上述最簡單的思路實現一下,你就明白了。
有人說,複雜邏輯我不怕啊,細心就好。so...是時候請出我們的大俠--「狀態機」了。
狀態機是編譯原理中的一種技術,學過電學的讀者應該也在《數字電子技術》中用過它,歸根結底,就是把複雜的問題邏輯化為乙個乙個的狀態,我們處理問題的過程就是在各個狀態之間不斷遷移(包含自遷移),這樣畫出來的圖就叫做狀態遷移圖,幫助我們把一鍋難纏的粥轉化為一張清晰的網。當然,這裡不會深究狀態機的概念,詳情請自查(比如還有狀態遷移表等等)。
我設定了兩個狀態,乙個用來區分括號內外,乙個用來區分是否是字母,從而進行不同的處理。
括號內外分成了兩個子狀態,這兩個子狀態是互斥的,因此他們內部的狀態變數可以共用。
至於狀態之間轉移條件,直接看**即可理解:
1有沒有感覺到很方便?思路更清晰了,效率也上去了。public
class
countwords
2021
public
static
void
test(string str)
37if (c == ')')
40//
括號內狀態
41if (state_inout ==inbracket)
46 } else
if (state_letter ==notletter) 51}
52}53//
括號外狀態
54else
if (state_inout ==outbracket)
61 outlengthofcurrentword = 0;
62 state_letter =notletter;
63 } else
if(character.isletter(c)) 66}
67if (state_letter ==notletter) 72}
73}74}
75 system.out.println("括號內的字串數:" +innumsofword);
76 system.out.println("括號外的最長字串長度:" +outlengthoflongestword);
77system.out.println();
7879}80
81 }
注:狀態機不同於設計模式中常說的狀態模式(狀態模式用類代表狀態)。
就這麼多吧,歡迎提出測試樣例找bug,共同進步。
按鍵的程式設計 狀態機1
現在的大學教育就是這樣。學無法致用。狀態機第一次見的時候是在數電裡面,那個時候是研究數位電路 比如鎖存器 用到的。不過由於是自學的,所以早就忘的一塌糊塗了。沒上完大學的人就是這樣啊。不過狀態機同樣在硬體的程式設計中得到廣泛使用。第一次見到狀態機的程式設計,就是在按鍵的程式設計中 馬潮老師的書 後來覺...
實際的狀態機程式設計思想例子(zz)
看看小時候玩的5塊錢那種最簡單的電子錶。只有2個按鈕就能操作。暫且稱為按鈕a和按鈕b 現給出乙個完整的功能文字描述 在顯示時間時按a,螢幕顯示變成日期 在顯示日期時按a,螢幕顯示變成秒鐘 在顯示秒鐘時按a,螢幕顯示變成時間 在顯示秒鐘時按b,秒鐘歸0 在顯示時間時按b,螢幕 時間 日期交替顯示。在時...
8 字串轉換整數(有限狀態機DFA)
字串處理的題目往往涉及複雜的流程以及條件情況,如果直接上手寫程式,一不小心就會寫出極其臃腫的 因此,為了有條理地分析每個輸入字元的處理方法,我們可以使用自動機這個概念。我就是直接上手擼 對題目沒有乙個整體的把握和設計,中途遇到某個沒有考慮到的情形就新增 去解決,結果導致之前解決好的問題出現錯誤,提交...