leetcode 8/300 字符串转换整数 py
题目要求
方法一:正则表达式
对于正则表达式函数的应用,可以看这个链接
class Solution:
def myAtoi(self, s: str) -> int:
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
'''
使用正则表达式 ^:匹配字符串开头,[\+\-]:代表一个+字符或-字符,?:前面一个字符可有可无,\d:一个数字,+:前面一个字符的一个或多个,\D:一个非数字字符
即该正则表达式的意思是需找一个以+或-开头的,或者二者都没有的数字
max(min(数字, 2**31 - 1), -2**31) 用来防止结果越界
s.lstrip()是将空格删除掉
*是将提取出来的部分当一个元组形式传入int()函数
'''
星号作用可参考此处:*作用
方法二:有限状态自动机
方法二多写一些就明白了,但是这个方法非常值得学习
解题思路:
INT_MAX = 2**31 -1
INT_MIN = -2**31
class Solution:
def myAtoi(self, s: str) -> int:
states = [
{' ':0,'d':2,'s': 1,'x':3},#0
{'d':2,' ':3,'s': 3,'x':3},#1
{'d':2,' ':3,'s': 3,'x':3},#2
{'d':3,' ':3,'s': 3,'x':3},#3
]
flag,ans,cur = 1,0,0
for i in s:
if i == ' ' : t=' '
elif i in '+-': t='s'
elif i.isdigit(): t='d'
else: t='x'
cur = states[cur][t]
if cur == 2:
ans = ans*10 + int(i)
ans = min(INT_MAX,ans) if flag == 1 else min(-INT_MIN,ans)
elif cur == 1:
flag = 1 if i == '+' else -1
return flag*ans
'''
有限状态自动机,
详解见链接:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/python3-you-xian-zhuang-tai-zi-dong-ji-b-rq6e/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
'''
本文来自博客园,作者:xingye_z,转载请注明原文链接:https://www.cnblogs.com/xyzhrrr/p/15470222.html