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;

    }
};
相关文章
|
6月前
|
C语言
Day6 不要二、把字符串转换成整数
Day6 不要二、把字符串转换成整数
57 0
|
2天前
|
存储 Java C++
字符串转换整数 (atoi)
实现一个 `atoi` 函数,用于将字符串转换成整数。函数首先去除字符串前导空格,然后根据首个非空字符(正/负号或数字)决定转换规则,最终生成一个有符号整数。若字符串无效或超出 32 位有符号整数范围,则返回 0 或边界值(`INT_MAX` 或 `INT_MIN`)。示例包括处理前导空格、正负号、多余字符及超范围值等情形。
11 0
|
1月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
17 0
|
3月前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
|
5月前
8. 字符串转换整数 (atoi)
8. 字符串转换整数 (atoi)
|
6月前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
6月前
|
存储 算法 C#
Leetcode算法系列| 8. 字符串转换整数 (atoi)
Leetcode算法系列| 8. 字符串转换整数 (atoi)
|
6月前
|
存储 C++
(C++)把字符串转换成整数
(C++)把字符串转换成整数
66 0
|
自然语言处理 Rust 算法
【算法】8. 字符串转换整数 (atoi)(多语言实现)
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读
|
算法 安全 Swift
LeetCode - #8 字符串转换整数(atoi)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。