学习自动状态机和正则表达式的运用
方法一:逐个判断
class Solution:
def myAtoi(self, s: str) -> int:
# 字符串为空
if len(s) == 0:
return 0
num_str = '0123456789'
sign_str = '+-'
valid_str = sign_str + num_str
num_char = ''
start = False # 开始标志
for char in s:
if char != ' ':
# num_char仍为空
if not start:
# 若非空字符不在valid_str中
if char not in valid_str:
return 0
# 字符为符号或数字
elif char in valid_str:
num_char += char
start = True
# num_char不为空
else:
if char in num_str:
num_char += char
# 字符不在num_str中,且num_char最后一个字符不是数字
elif num_char[-1] not in num_str:
return 0
else:
break
elif start:
break
if len(num_char) == 0 or num_char[-1] not in num_str:
return 0
num = int(num_char)
if num < (-2)**31:
return (-2)**31
elif num > 2**31 - 1:
return 2**31 - 1
else:
return num
方法二:自动状态机
INT_MAX = 2**31 - 1
INT_MIN = (-2)**31
class Automaton:
def __init__(self):
self.state = 'start'
self.sign = 1
self.ans = 0
# 状态表
self.table = {
'start': ['start', 'sign', 'in_number', 'end'],
'sign': ['end', 'end', 'in_number', 'end'],
'in_number': ['end', 'end', 'in_number', 'end'],
'end': ['end', 'end', 'end', 'end']
}
def get_state(self, c):
if c == ' ':
return 0
elif c in '+-':
return 1
elif c in '0123456789':
return 2
else:
return 3
def get(self, c):
self.state = self.table[self.state][self.get_state(c)]
if self.state == 'sign':
self.sign = 1 if c == '+' else -1
elif self.state == 'in_number':
self.ans = 10 * self.ans + int(c)
self.ans = min(self.ans, INT_MAX) if self.sign == 1 else min(self.ans, -INT_MIN)
class Solution:
def myAtoi(self, s: str) -> int:
automaton = Automaton()
for c in s:
automaton.get(c)
return automaton.sign * automaton.ans
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 为字符串的长度。我们只需要依次处理所有的字符,处理每个字符需要的时间为 O ( 1 ) O(1) O(1)。
- 空间复杂度: O ( 1 ) O(1) O(1),自动机的状态只需要常数空间存储。
方法三:正则表达式
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
这里需要注意,如果正则表达式中加入^
表示从字符串开头匹配,如下所示: