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;

    }
};
相关文章
|
7月前
|
C语言
Day6 不要二、把字符串转换成整数
Day6 不要二、把字符串转换成整数
62 0
|
1月前
|
存储 Java C++
字符串转换整数 (atoi)
实现一个 `atoi` 函数,用于将字符串转换成整数。函数首先去除字符串前导空格,然后根据首个非空字符(正/负号或数字)决定转换规则,最终生成一个有符号整数。若字符串无效或超出 32 位有符号整数范围,则返回 0 或边界值(`INT_MAX` 或 `INT_MIN`)。示例包括处理前导空格、正负号、多余字符及超范围值等情形。
29 0
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
22 0
|
4月前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
|
6月前
8. 字符串转换整数 (atoi)
8. 字符串转换整数 (atoi)
|
7月前
|
存储 算法 C#
Leetcode算法系列| 8. 字符串转换整数 (atoi)
Leetcode算法系列| 8. 字符串转换整数 (atoi)
|
7月前
|
存储 C++
(C++)把字符串转换成整数
(C++)把字符串转换成整数
75 0
|
算法 安全 Swift
LeetCode - #8 字符串转换整数(atoi)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
存储 测试技术
leetcode:8.字符串转换正数(atoi)
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
51 0
|
存储 算法 C++
【每日算法Day 89】手动实现字符串转整数(atoi)函数,你会吗?
【每日算法Day 89】手动实现字符串转整数(atoi)函数,你会吗?

热门文章

最新文章