1、分析規律,邏輯判斷,需要特別注意特殊情況。
2、確定有限自動機(dfa)。構造dfa可以先寫正規表示式再轉換成dfa,也可以直接寫。如下圖所示dfa中紅色為終止狀態,藍色為中間狀態。dfa從狀態0開始接收字元,當輸入字元結束時當前狀態處於中間狀態,則拒絕;如果到達終止狀態,則接受。狀態0和8用於處理開始和結束時的空格。
紅色的3個終止狀態分別表示小數點前的數字、小數點後的數字、e後的數字。同樣都是數字但是位置不同,不是乙個狀態。比如小數點前的數字可以轉移到小數點,但是小數點後的數字無法轉移到小數點。
' ''+/-'
'0-9'
'.''e/e'
other00
162-1
-11-1-162
-1-12-1
-13-1-1-13
8-13-1
4-14-1
75-1-1-15
8-15-1
-1-168
-1634
-17-1-15-1
-1-188
-1-1
-1-1
-1python
class solution(object):
def isnumber(self, s):
""":type s: str
:rtype: bool
"""point = -1
e = -1
s = s.strip(' ')
if len(s) == 0:
return false
firstnum = -1
for i in range(len(s)):
# +/-只能出現在第乙個字元或e之後, 但不能是最後乙個字元
if s[i] in ['+', '-']:
if (i != 0 and s[i-1] not in ['e', 'e']) or i == len(s) - 1:
return false
elif s[i] == '.':
# .前面出現過.||.前沒有數字且是最後乙個字元, false
if point != -1 or (firstnum == -1 and i == len(s) - 1):
return false
else:
point = i
elif s[i] in ['e', 'e']:
# e是第乙個或最後乙個字元||e前面出現過e||e前面沒有數字, false
if i == 0 or i == len(s) - 1 or e != -1 or firstnum == -1:
return false
# 出現過e, 且e之後不能出現.
else:
e = i
point = i
elif '0' <= s[i] <= '9':
if firstnum == -1:
firstnum = i
continue
else:
return false
return true
class solution(object):
def isnumber(self, s):
""":type s: str
:rtype: bool
"""numseen = false
dotseen = false
eseen = false
# 去掉前後的空格
s = s.strip(' ')
if len(s) == 0:
return false
for i in range(len(s)):
if '0' <= s[i] <= '9':
numseen = true
# .之前不能出現.和e
elif s[i] == '.':
if dotseen or eseen:
return false
else:
dotseen = true
# e之前不能出現e, 且必須出現數字
elif s[i] in ['e', 'e']:
if eseen or not numseen:
return false
else:
eseen = true
numseen = false # e之後也要出現數字
elif s[i] in ['-', '+']:
if i != 0 and s[i-1] not in ['e', 'e']:
return false
else:
return false
return numseen
class solution(object):
def getindex(self, c):
myindex =
if '0' <= c <= '9':
return myindex.get('num')
else:
return myindex.get(c, -1)
def isnumber(self, s):
""":type s: str
:rtype: bool
"""state = 0
finals = 0b101101000 # 終止狀態3/5/6/8
transfer = [
[0, 1, 6, 2, -1],
[-1, -1, 6, 2, -1],
[-1, -1, 3, -1, -1],
[8, -1, 3, -1, 4],
[-1, 7, 5, -1, -1],
[8, -1, 5, -1, -1],
[8, -1, 6, 3, 4],
[-1, -1, 5, -1, -1],
[8, -1, -1, -1, -1]]
for c in s:
id = self.getindex(c)
if id < 0:
return false
state = transfer[state][id]
if state < 0:
return false
# 1 << state表示1向左移動state位
return (finals & (1 << state)) > 0
面試題20 表示數值的字串
題目 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 及 1e 16 都表示數值,但 12e 1a3.14 1.2.3 5 及 12e 5.4 都不是。includeusing namespace std bool scanunsignedi...
面試題20 表示數值的字串
題目 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 0123 都表示數值,但 12e 1a3.14 1.2.3 5 1e 16 及 12e 5.4 都不是。示例 輸入 100 輸出 true 思想 這個題最簡單的做法就是遍歷字串,判斷字串是...
leetcode 面試題專題
面試題51.陣列中的逆序對 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。利用歸併排序,將陣列分成兩部分,前面一部分和後面一部分,進行歸併的時候,需要比較兩個陣列的數值大小,如果第二個陣列的值小的話,代表前乙個陣列剩下的都...