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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
'''
posted @ 2021-10-27 13:23  xingye_z  阅读(43)  评论(0编辑  收藏  举报