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

该代码段定义了一个Python类Solution,包含方法myAtoi,用于从字符串中提取开头的数字。它首先去除首尾空格,然后检查字符串是否以数字或正负号开始。接下来,移除开头的零并处理负号。在处理过程中,确保结果在INT_MAX和INT_MIN之间,这两个是整数的最大和最小值。
摘要由CSDN通过智能技术生成

注意,这题开头必须是数字,如果不是数字或者正负号,直接返回0。这题不是从字符当中取数值。而是提取字符开头的数字,如果不是数字就返回0。
思路就是先判断这个字符是否“合格”,也就是开头是否“有数”。
如果有,则下一步,去掉开头的0和结尾的无用字符。
最后将字符转为数字格式。

这题主要是用到了ascii码,0-9的ascii码是 48-57,直接判断ascii码是不是在48-57范围就ok。+/-号就不用ascii了,因为可以直接判断+和-。

class Solution:
    INT_MAX = 2 ** 31 - 1
    INT_MIN = -2 ** 31
    def myAtoi(self, s: str) -> int:
        # 先将开头和结尾的空格去掉
        s = s.strip()
        if s == "" or s == "-" or s == "+":
            return 0
        # 先判断这个字符串是否符合要求,否则直接返回0
        if not self.valid(s):
            return 0        
        num_str = self.remove_head_zero_zuo(s)
        negative = False
        res = 0
        for i in range(len(num_str)):
            if num_str[i] == "-":
                negative = True
                continue
            elif num_str[i] == "+":
                continue
            num = ord(num_str[i]) - 48
            res *= 10
            res += num
        if negative:
            res = -res
        if res > self.INT_MAX:
            res = self.INT_MAX
        elif res < self.INT_MIN:
            res = self.INT_MIN
        return res
    def valid(self, s):
        if s[0] == "-" or s[0] == "+":
            if ord(s[1]) >= ord('0') and ord(s[1]) <= ord('9'):
                return True
            else:
                return False
            
        elif ord(s[0]) >= ord('0') and ord(s[0]) <= ord('9'):
            return True
        else:
            return False
    def remove_head_zero_zuo(self, s):  
        # fnz:第一个不为0的字符位置 first not zero location
        r = True if s[0] == "+" or s[0] == "-" else False

        # 从左往右,一直到不为0,则break
        fnz = 1 if r else 0  # 开头的0的位置,当然开头也可能不是0
        while fnz < len(s):  
            if s[fnz] != "0":
                break
            fnz += 1
        # e为数字之后的第一个非数字字符。也就是数字的结尾。这个是从右到左遍历
        e = -1
        i = len(s) - 1
        while i >= (1 if r else 0): # 当开头是+或者-就到最多到第二个位置,否则遍历整个数组
            if ord(s[i]) < ord('0') or ord(s[i]) > ord('9'):
                e = i
            # 当之后都是数字,e就不再更新了
            i -= 1
        # 所以总体是[fnz,e)即为数字
        return (s[0] if r else "") + s[fnz:e if e != -1 else None]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值