作弊法:利用try…except機制,直接判斷是否可以通過float()函式
class solution:
def isnumber(self, s: str) -> bool:
try:
float(s)
return true
except:
return false
面試的時候這麼寫基本byebye
設定幾個布林值:dot_seen = false
,e_seen = false
,num_seen = false
,分別代表該型別的值是否已經出現過
利用s.strip()函式將s兩邊的空格去掉,然後遍歷,根據當前元素的型別,將不是有效數字的情況列出,return false:
當前元素為數字,那麼下乙個元素是什麼型別都可以,所以只要digit_seen變為true;
當前元素為e,如果之前已經出現過e,或者沒有出現過數字,那麼不是有效數字,false;
當前元素是小數點,如果之前已經出現過小數點或者e,那麼不是有效數字,false;
當前元素是正負號,如果該元素不是首位,且前乙個元素不是e,那麼肯定不是有效數字,false。
**
class solution:
def isnumber(self, s: str) -> bool:
s = s.strip()
dot_seen = false
e_seen = false
num_seen = false
for i,a in enumerate(s):
if a.isdigit():
num_seen = true
elif a == '.':
if dot_seen or e_seen:
return false
dot_seen = true
elif a == 'e':
if e_seen or not num_seen:
return false
e_seen = true
num_seen = false #因為e之後必須再次判斷是否出現數字,所以這裡要把num_seen置為false
elif a in '+-':
if i > 0 and s[i-1] != 'e':
return false
else:
return false
return num_seen
有限自動機法我理解了一下,就是判斷狀態是否可以轉移,最終是否能轉移到合格的狀態上,如圖:
畫出狀態轉移表,結構為states[n]儲存n個狀態;
states[i]為乙個hashtable,表示從此狀態允許跳轉到的狀態;
主迴圈中遍歷字串,通過狀態轉移表判斷結構是否成立:
若中途遇到無法跳轉的狀態,直接返回false;
若成功遍歷完字串,要判斷結束狀態是否在允許的結束狀態內,本題為[3, 5, 8, 9]。
**
class solution:
def isnumber(self, s: str) -> bool:
state = [
{},# 狀態1,初始狀態(掃瞄通過的空格)
,# 狀態2,發現符號位(後面跟數字或者小數點)
,# 狀態3,數字(一直迴圈到非數字)
,# 狀態4,小數點(後面只有緊接數字)
,# 狀態5,小數點之後(後面只能為數字,e,或者以空格結束)
,# 狀態6,發現e(後面只能符號位, 和數字)
,# 狀態7,e之後(只能為數字)
,# 狀態8,e之後的數字後面(只能為數字或者以空格結束)
,# 狀態9, 終止狀態 (如果發現非空,就失敗)
]cur_state = 1
for i in s:
if i.isdigit():
i = 'num'
elif i == '.':
i = 'dot'
elif i in '+-':
i = 'sign'
elif i == ' ':
i = 'blank'
elif i == 'e':
i = 'e'
if i not in state[cur_state]:
return false
cur_state = state[cur_state][i]
return cur_state in [3,5,8,9]
知乎上,九四幹的leetcode刷題專欄 leetcode 65 有效數字
不知道這道題對於演算法有什麼作用,而且每個人可能理解有效的數字都不一樣,怎麼能證明考慮周到不周到呢,不斷的提交就完了 下面的是我認為肯定不合格但是卻是合格的一些代表 45.e 67 true 1 true 1.true 0123 true bool isnumber std string s if ...
leetcode65 有效數字
驗證給定的字串是否為數字。例如 0 true 0.1 true abc false 1 a false 2e10 true 說明 我們有意將問題陳述地比較模糊。在實現 之前,你應當事先思考所有可能的情況。更新於 2015 02 10 c 函式的形式已經更新了。如果你仍然看見你的函式接收 const ...
leetcode65 有效數字
驗證給定的字串是否可以解釋為十進位制數字。例如 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 ...