65 有效數字

2021-10-18 12:53:01 字數 4045 閱讀 1213

題目描述

有效數字(按順序)可以分成以下幾個部分:

乙個小數或者整數(可選)乙個'e''e',後面跟著乙個整數

小數(按順序)可以分成以下幾個部分:

(可選)乙個符號字元('+''-'

下述格式之一:

至少一位數字,後面跟著乙個點'.'至少一位數字,後面跟著乙個點'.',後面再跟著至少一位數字

乙個點'.',後面跟著至少一位數字

整數(按順序)可以分成以下幾個部分:

(可選)乙個符號字元('+''-'

至少一位數字

部分有效數字列舉如下:

部分無效數字列舉如下:

給你乙個字串s,如果s是乙個有效數字,請返回true

示例 1:

輸入:s = "0"

輸出:true

示例 2:

輸入:s = "e"

輸出:false

示例 3:

輸入:s = "."

輸出:false

示例 4:

輸入:s = ".1"

輸出:true

題解:法一:

正規表示式。

有效數字模式為:a[.[b]][[e|e]c]或者.b[[e|e]c],其中,a、b、c都是整數,a、c可以是有符號整數,b是無符號整數。表示可以出現0/1次。

於是按照上述模式判斷即可:

首先處理s的首尾空格,很神奇的測試資料。。。

假設存在a部分,先判斷a那部分(該部分可以使用兩個函式來表示,後面的bc部分都能用上)

bool

integer

( string& s,

int& p )

bool

unsignedinteger

( string& s,

int& p )

在把a部分遍歷完後,若當前位為.,需要判斷b是否存在。

假設我們使用numeric表示前面是否合法,如果前面合法,那麼unsignedinteger( s, ++i ) | numeric應該為true,使用|操作是因為小數包含了三種情況:

沒有整數部分,比如.123等於0.123沒有小數部分,比如233.等於233.0小數點前後都有數字

小數部分遍歷結束後,若當前位為e/e,需要判斷c是否存在,如果前面合法,那麼integer( s, ++i ) & numeric應該為true,因為e/e前後必須有數字,所以使用&操作。

最後,如果numerictrue且遍歷完s所有字元,則說明s是有效的數字。

時間複雜度:o(n

)o(n)

o(n)

額外空間複雜度:o(1

)o(1)

o(1)

法一**:

class

solution

bool

unsignedinteger

( string& s,

int& p )

bool

isnumber

(string s)};

/*記憶體:5.8mb,擊敗:98.05%

*/

法二:

分類討論。

有兩種寫法,一種是設定幾個標誌位來判斷當前是否合法,我們設定三個標誌位num(數字)point(小數點)nume(e/e)

有一些不合法的情況:

剩下的,就很容易判斷了,見**:

class

solution

else

if( s[i]

=='e'

|| s[i]

=='e'

)else

if( s[i]

=='+'

|| s[i]

=='-'

)else

if( s[i]

!=' '

)return

false

;++i;

}return num && i == n;}}

;/*記憶體:5.7mb,擊敗:99.84%

*/

還有另外一種寫法,在遍歷過程中,遇到非法的情況返回false,到達末尾返回true

class

solution

if( n_pt >

1|| n_nm <1)

return

false;if

( i == n )

return

true;if

( s[i]

=='e'

|| s[i]

=='e'

)while

( i < n && s[i]

==' '

)++i;

return i == n;}}

;/*記憶體:5.8mb,擊敗:98.54%

*/

法三:

自動機。

總共9個狀態。橙色代表合法狀態,輸入分為四大類,數字、小數點、e/e、+/-。開始在狀態0,我們根據類別進行狀態轉移。

最終的合法狀態在:2、3、8、5這四個狀態。

class

solution

elseif(

isdigit

(s[i]))

else

if( s[i]

=='.'

)else

if( s[i]

=='e'

|| s[i]

=='e'

)else

return

false;}

return state ==

2|| state ==

3|| state ==

5|| state ==8;

}};/*

記憶體:5.9mb,擊敗:94.15%

*/

65 有效數字

驗證給定的字串是否為數字。例如 0 true 0.1 true abc false 1 a false 2e10 true 說明 我們有意將問題陳述地比較模糊。在實現 之前,你應當事先思考所有可能的情況。更新於 2015 02 10 c 函式的形式已經更新了。如果你仍然看見你的函式接收 const ...

65有效數字

驗證給定的字串是否可以解釋為十進位制數字。例如 0 true 0.1 true abc false 1 a false 2e10 true 90e3 true 1e false e3 false 6e 1 true 99e2.5 false 53.5e93 true 6 false 3 false ...

65 有效數字

有效數字 按順序 可以分成以下幾個部分 乙個 小數 或者 整數 可選 乙個 e 或 e 後面跟著乙個 整數 小數 按順序 可以分成以下幾個部分 可選 乙個符號字元 或 下述格式之一 至少一位數字,後面跟著乙個點 至少一位數字,後面跟著乙個點 後面再跟著至少一位數字 乙個點 後面跟著至少一位數字 整數...