8. 字符串转换整数 (atoi)

本文介绍了将字符串转换为整数的三种Python实现方式:使用if-else语句,有限状态机以及正则表达式。每种方法都考虑了空格、符号和数字范围的处理,确保了转换的正确性。通过比较执行时间和内存消耗,展示了不同方法的效率和适用场景。
摘要由CSDN通过智能技术生成

8. 字符串转换整数 (atoi)

法一:if-else

题目没审清导致细节问题多。

执行用时: 56 ms , 在所有 Python3 提交中击败了14.32% 的用户
内存消耗:14.8 MB , 在所有 Python3 提交中击败了90.40% 的用

添加对0的判断,性能提高。

执行用时: 40 ms , 在所有 Python3 提交中击败了86.12% 的用户
内存消耗:14.8 MB , 在所有 Python3 提交中击败了85.19% 的用户

class Solution:
    def myAtoi(self, s: str) -> int:
        mn=-2**31#1<<31位运算更快
        mx=2**31-1
        flag=1
        num=''
        i=0
        while i<len(s):
            while i<len(s) and s[i]==' ':
                i+=1
            if i<len(s) and s[i]=='-':
                flag=-1
                i+=1
            elif i<len(s) and s[i]=='+':
                i+=1
            '''
            添加对0的判断,性能提高。
			while i<len(s) and s[i].isdigit() and len(num)<11:
                if s[i]!='0' or num:
                    num=num+s[i]
                i+=1
			'''
            while i<len(s) and s[i].isdigit():
                num=num+s[i]
                i+=1
            break
        if num=='':
            return 0
        if mn<flag*int(num)<mx:
            return flag*int(num)
        elif flag==1:
            return mx
        else:
            return mn

法二:有限状态机

执行用时:44 ms, 在所有 Python3 提交中击败了69.22%的用户
内存消耗:14.9 MB, 在所有 Python3 提交中击败了59.52%的用户

mx=(1<<31)-1
mn=-(1<<31)
class Solution:
    def myAtoi(self, s: str) -> int:
        automaton=Automaton()
        for i in s:
            automaton.get(i)
        return automaton.sign*automaton.ans
class Automaton:
    def __init__(self):
        self.state='start'
        self.sign=1
        self.ans=0
        self.table={
            'start':('start','signed','in_number','end'),
            'signed':('end','end','in_number','end'),
            'in_number':('end','end','in_number','end'),
            'end':('end','end','end','end')
        }
    def get_col(self,c):
        if c==' ':
            return 0
        elif c=='+' or c=='-':
            return 1
        elif c.isdigit():
            return 2
        else:
            return 3
    def get(self,c):
        self.state=self.table[self.state][self.get_col(c)]
        if self.state=='signed':
            self.sign=-1 if c=='-' else 1
        elif self.state=='in_number':
            self.ans=self.ans*10+int(c) 
            self.ans=min(self.ans,mx) if self.sign==1 else min(self.ans,-mn)

法三:正则表达式匹配

python使用正则表达式(Regular Expression)超详细

执行用时: 48 ms , 在所有 Python3 提交中击败了48.06% 的用户
内存消耗:14.9 MB , 在所有 Python3 提交中击败了 64.12% 的用户

class Solution:
    def myAtoi(self, s: str) -> int:
        return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)
        '''
import re
class Solution:
    def myAtoi(self, str: str) -> int:
        INT_MAX = 2147483647    
        INT_MIN = -2147483648
        str = str.lstrip()      #清除左边多余的空格
        num_re = re.compile(r'^[\+\-]?\d+')   #设置正则规则
        num = num_re.findall(str)   #查找匹配的内容
        num = int(*num) #由于返回的是个列表,解包并且转换成整数
        return max(min(num,INT_MAX),INT_MIN)    #返回值
        '''

^:匹配字符串开头
[+-]:代表一个+字符或-字符
?:前面一个字符可有可无
\d:一个数字
+:前面一个字符的一个或多个
\D:一个非数字字符
*:前面一个字符的0个或多个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值