8 字符串转换整数(atoi)

简介: ×

image-20221103224946400

image-20221103225101443

上面是官方自动机图解模型

' ' +/- number other
start start signed in_number end
signed end end in_number end
in_number end end in_number end
end end end end end
#官方python代码
#
# @lc app=leetcode.cn id=8 lang=python3
#
# [8] 字符串转换整数 (atoi)
#

# @lc code=start
INT_MAX = 2**31-1
INT_MIN = -2**31


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.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, INT_MAX) if self.sign == 1 else min(
                self.ans, -INT_MIN)
        elif self.state == 'signed':
            self.sign = 1 if c == '+' else -1


class Solution:
    def myAtoi(self, s: str) -> int:
        automaton = Automaton()
        for c in s:
            automaton.get(c)
        return automaton.sign*automaton.ans


# @lc code=end
//官方C++代码
class Automation{
    string state="start";
    unordered_map<string,vector<string>> tabel={
        {"start",{"start","signed","in_number","end"}},
        {"signed",{"end","end","in_number","end"}},
        {"in_number",{"end","end","in_number","end"}},
        {"end",{"end","end","end","end"}}
    };
    int get_col(char c){
        if(isspace(c)) return 0;
        if(c=='+' or c=='-') return 1;
        if(isdigit(c)) return 2;
        return 3;
    }
public:
    int sign=1;
    long long ans=0;
    void get(char c){
        state=tabel[state][get_col(c)];
        if (state=="in_number"){
            ans=ans*10+c-'0';
            ans=sign==1?min(ans,(long long)INT_MAX):min(ans,-(long long)INT_MIN);
        }
        else if(state=="signed")
        sign=c=='+'?1:-1;
    }
};

class Solution {
public:
    int myAtoi(string s) {
        Automation automation;
        for (char c:s)
            automation.get(c);
        return automation.sign * automation.ans;

    }
};
相关文章
|
4月前
|
C语言
Day6 不要二、把字符串转换成整数
Day6 不要二、把字符串转换成整数
46 0
|
27天前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
|
3月前
8. 字符串转换整数 (atoi)
8. 字符串转换整数 (atoi)
|
4月前
|
存储 算法 C#
Leetcode算法系列| 8. 字符串转换整数 (atoi)
Leetcode算法系列| 8. 字符串转换整数 (atoi)
|
4月前
|
存储 C++
(C++)把字符串转换成整数
(C++)把字符串转换成整数
45 0
|
自然语言处理 Rust 算法
【算法】8. 字符串转换整数 (atoi)(多语言实现)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读
|
算法 安全 Swift
LeetCode - #8 字符串转换整数(atoi)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法 C++
字符串转换整数 (atoi)
字符串转换整数 (atoi)
144 0
|
存储 测试技术
leetcode:8.字符串转换正数(atoi)
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
35 0
|
存储 算法 C++
【每日算法Day 89】手动实现字符串转整数(atoi)函数,你会吗?
【每日算法Day 89】手动实现字符串转整数(atoi)函数,你会吗?