以上是三種方法的提交結果,第乙個為官方解答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...