題目描述
有效數字(按順序)可以分成以下幾個部分:
乙個小數或者整數(可選)乙個'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
那部分(該部分可以使用兩個函式來表示,後面的b
和c
部分都能用上)
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
前後必須有數字,所以使用&
操作。
最後,如果numeric
為true
且遍歷完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 後面跟著乙個 整數 小數 按順序 可以分成以下幾個部分 可選 乙個符號字元 或 下述格式之一 至少一位數字,後面跟著乙個點 至少一位數字,後面跟著乙個點 後面再跟著至少一位數字 乙個點 後面跟著至少一位數字 整數...