zoukankan      html  css  js  c++  java
  • 8. 字符串转换整数 (atoi)

    请你来实现一个 atoi 函数,使其能将字符串转换成整数。

    首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

    • 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
    • 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
    • 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。

    注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

    在任何情况下,若函数不能进行有效的转换时,请返回 0 。

    提示:

    • 本题中的空白字符只包括空格字符 ' ' 。
    • 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

    示例 1:

    输入: "42"
    输出: 42
    

    示例 2:

    输入: "   -42"
    输出: -42
    解释: 第一个非空白字符为 '-', 它是一个负号。
         我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
    

    示例 3:

    输入: "4193 with words"
    输出: 4193
    解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
    

    示例 4:

    输入: "words and 987"
    输出: 0
    解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
         因此无法执行有效的转换。

    示例 5:

    输入: "-91283472332"
    输出: -2147483648
    解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
         因此返回 INT_MIN (−231) 。


    class Solution:
        def myAtoi(self, str: str) -> int:
            if not str:return 0
            res=''
            s=str.lstrip()
            for i in range(len(s)):
                if s[i].isalpha() or s[i]==' ' or s[i]=='.':break
                if i>0 and not s[i].isdigit():break
                if s[i].isdigit():
                    res+=s[i]
                
            if not res:return 0
            if s[0]=='-':
                if not s[1].isdigit():
                    return 0
                res='-'+res
            if s[0]=='+' and not s[1].isdigit():
                return 0
            
            res=int(res)
            if res>=2147483648:
                return 2147483647
            elif res<=-2147483648:
                return -2147483648
            else:
                return res 
           


    MAX=2**31-1
    MIN=-2**31
    class Auto:
        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.isspace():
                return 0
            if c=='+' or c=='-':
                return 1
            if c.isdigit():
                return 2
            return 3
    
        def get(self,c):
            self.state=self.table[self.state][self.get_col(c)]
            if self.state=='in_number':
                self.ans=self.ans*10+int(c)
                self.ans=min(self.ans,MAX) if self.sign==1 else min(self.ans,-MIN)
            elif self.state=='signed':
                self.sign=1 if c=='+' else -1
    
    class Solution:
        def myAtoi(self, str: str) -> int:
            auto=Auto()
            for c in str:
                auto.get(c)
            return auto.sign*auto.ans
  • 相关阅读:
    优秀JS学习站点
    一些比较好的论坛、博客
    最全前端问题及答案总结[转]
    EDM制作要点
    前端技术-调试工具(下)
    前端技术-调试工具(上)
    smartJQueryZoom(smartZoom) 的使用方法
    修改博客园日历的默认样式
    smartJQueryZoom(smartZoom) 存在的兼容性BUG,以及解决方法
    javascript实战 : 简单的颜色渐变
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14164932.html
Copyright © 2011-2022 走看看