LeetCode 面試題20 表示數值的字串

2022-04-15 07:58:20 字數 3230 閱讀 3872

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.陣列中的逆序對 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。利用歸併排序,將陣列分成兩部分,前面一部分和後面一部分,進行歸併的時候,需要比較兩個陣列的數值大小,如果第二個陣列的值小的話,代表前乙個陣列剩下的都...