劍指Offer 20 表示數值的字串

2022-06-06 11:06:11 字數 1808 閱讀 8060

請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。

字串"+100"、"5e2"、"-123"、"3.1416"、"-1e-16"、"0123"都表示數值,

但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。

class solution ,,,

,,,,

,};

int state = 0; // 初始狀態

for (char i : s)

return state == 2 || state == 3 || state == 7 || state == 8 ; // 滿足幾個正確的最終狀態則返回true

}};

本題使用有限狀態自動機。根據字元型別和合法數值的特點,先定義每個字元輸入前的狀態,再作出狀態轉移矩陣,最後編寫**即可。

根據題目給出的示例以及一些嘗試,需要特別注意的要求有:

根據以上要求,我們列舉乙個盡可能複雜的滿足要求的字串+1.2e-2,參考這個字串開始定義狀態,這個階段不需要考慮狀態冗餘的問題。我們不僅需要把不同字元型別定義為不同狀態,還需要把相同型別但在不同前後文狀態的字元定義為不同狀態。例如上述例子中,1.2-2都表示數字,但e前後對數字的要求是不同的,不能簡單地定義為乙個狀態。另外,小數點前後的數字也不能定義為乙個狀態。同理,小數點前是否存在數字也對後續狀態有影響(例如1.可以,.不行)。

根據以上結論,此題所有狀態的定義是:0.初始狀態;1.前空格;2.e、e前的正負號;3.小數點前的數;4.前面有數字的小數點;5.前面沒數字的小數點;6.小數點後的數字;7.e、e;8.e、e後的正負號;9.e後的數字;10.後空格。

我們建立以上狀態對應的轉移矩陣:

空格+、-

數字小數點

e、e012

35-11

1235

-12-1-135

-1310-134

7410-16-1

75-1-16-1

-1610-16-1

77-18

9-1-18

-1-19-1

-1910-19-1

-110

10-1

-1-1

-1列出該矩陣後,我們可以開始簡化狀態。整個檢查流程如下:

除開轉移到自身和轉移到對方的那一項狀態(如6: 0, 7, 4, 6, 6, 97: 0, 6, 4, 6, 7, 9可以合併),合併其餘轉移狀態完全相同的狀態(狀態0與狀態1,狀態4與狀態6);

重複第一條直到沒有滿足要求的狀態。

其實稍微看一下就可以了,有冗餘的狀態也就輸入狀態轉移方程的時候多打點字。本題刪除冗餘後的狀態為:0.初始狀態或前空格;1.e、e前的正負號;2.小數點前的數;3.前面有數字的小數點;4.前面沒數字的小數點或者小數點後的數字;5.e、e;6.e、e後的正負號;7.e後的數字;8.後空格。最終得到的狀態轉移矩陣為:

空格+、-

數字小數點

e、e001

24-11

-1-124

-128-1

2353

8-13-1

54-1-13-1

-15-16

7-1-16

-1-17-1

-1788

9-1-18

8-19-1

-1最後,我們需要確定哪些狀態可以用來當最終狀態。本題可以作為最終狀態的為2、3、7、8。

劍指Offer 20 表示數值的字串

請實現乙個函式來判斷字串是否表示數值 包括整數和小數 例 字串 100 5e2 123 3.1416 1e 16 都表示數值,但 12e 1a3.14 1.2.3 5 12e 5.4 都不是。時間複雜度 o n 空間複雜度 o 1 def numeric strings s param s num ...

劍指Offer20 表示數值的字串

題目 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。考察的是 模式匹配的策略 的完整性 我們首先分析一下子可能是數值的字串的格式 在數值之前...

劍指offer 20 表示數值的字串

請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如 字串 100 5e2 123 3.1416 和 1e 16 都表示數值 但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是 使用指標的指標 a.b e e c 對a b c 的判斷 class solution if ...