leetcode 8 思路及code(帶注釋)

2021-10-18 07:35:09 字數 3286 閱讀 4593

以上是三種方法的提交結果,第乙個為官方解答dfa,第二個為自己手寫的if-else,最後乙個為正則匹配。

題目並不難,函式主要就是解決字串轉數字

去掉開頭的空格字元

符號判斷,正負數,需要注意特殊情況 [+1 -> 1; ±1 -> 0]

迴圈找到數字邊界

轉為整數,輸出,注意題目邊界要求

class

solution

:def

myatoi

(self, s:

str)

->

int:

maxvalue =2**

31 i =

0 s = s.lstrip(

)# 去字串最左端空格

if s =='':

# 異常處理空字串

return

0# 處理符號

sign =

1if s[0]

=='-'

: sign =-1

i =1if s[0]

=='+'

: i =

1# 查詢字元中數字開頭結尾

start = i

while i <

len(s)

and'0'

<= s[i]

<=

'9':

i +=

1if start == i:

return

0 x = sign *

int(s[start:i])if

-maxvalue <= x < maxvalue:

return x

elif x <

-maxvalue:

return

-maxvalue

else

:return maxvalue -

1

正規表示式提取

符號判斷,正負數,需要注意特殊情況 [+1 -> 1; ±1 -> 0]

迴圈找到數字邊界

轉為整數,輸出,注意題目邊界要求

class

solution2

:def

myatoi

(self, s:

str)

->

int:

''' 1. s.lstrip() 刪除字串最左端空格字元

2. 正規表示式 ^[\+\-]?\d+, ^匹配字串開頭字元, [\+\-]?匹配0個或者乙個中括號中的字元,\d表示數字字元,+表示至少乙個

3. re.findall返回列表, 前面的*是解包的意思,由於取第乙個數字串,故列表中只有乙個元素,解包即去掉列表轉為字串,但是這裡不能取

4. int(*re.findall),找到即返回數字,否則就是0

5. 處理越界,先與最大取最小值,在與最小值取最大值

:param s:

:return:

'''return

max(

min(

int(

*re.findall(

'^[\+\-]?\d+'

, s.lstrip())

),2**

31-1)

,-2**

31)

狀態轉移圖

狀態轉移表

程式表示狀態轉移表

class

dfa:

def__init__

(self)

:'''

繪製狀態轉移表

state為當前狀態,初始為start

sign為正負號標記

ans為最終答案

state_table為狀態轉移表

'''self.state =

'start'

self.sign =

1 self.ans =

0 self.state_table =

defget_col_state

(self, char)

:'''

對應每個列表下標

:param char:

:return:

'''if char.isspace():

return

0elif char ==

'-'or char ==

'+':

return

1elif char.isdigit():

return

2else

:return

3def

get_current_state

(self, char)

:'''

獲取當前狀態並更新狀態

獲取當前值,儲存符號狀態

:param char:

:return:

'''self.state = self.state_table[self.state]

[self.get_col_state(char)

]if self.state ==

'in_num'

: self.ans = self.ans *10+

int(char)

self.ans =

min(self.ans, max_signed)

if self.sign ==

1else

min(self.ans,

-min_signed)

if self.state ==

'signed'

: self.sign =-1

if char ==

'-'else

1class

solution

:def

myatoi

(self, s:

str)

->

int:

dfa = dfa(

)for c in s:

dfa.get_current_state(c)

return dfa.sign * dfa.ans

兩數相加 LeetCode (8)

給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原...

leetcode 8 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。雙指標from collections import defaultdict class solution def threesum self,nums ...

LeetCode 8 有效的括號

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...