leetcode-8,真恶心

题目:

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

推导:

代码:

 1 class Automaton {
 2 public:
 3     int sign = 1; // 初始化默认符号
 4     long long ans = 0; // 初始化整数
 5     unordered_map<string, vector<string>> table = {
 6         {"start", {"start", "signed", "in_number", "end"}},
 7         {"signed", {"end", "end", "in_number", "end"}}, 
 8         {"in_number", {"end", "end", "in_number", "end"}},
 9         {"end", {"end", "end", "end", "end"}}
10     };
11 
12     // 定义输入类型
13     int get_char(char c) {
14         if (isspace(c)) return 0;
15         // 当比较字符时,确保使用单引号来表示字符字面量,而不是双引号的字符串字面量
16         if (c == '+' || c == '-') return 1;
17         if (isdigit(c)) return 2;
18         return 3;
19     }
20 
21     // 对输出整数进行操作
22     string output (char c, string state) {
23         // 状态转移
24         state = table[state][get_char(c)];
25 
26         // 计算整数
27         if (state == "in_number") {
28             ans = ans*10 + c - '0';
29             // 注意:这里采用 min(ans, -(long long)INT_MIN) 而不是 max(ans, (long long)INT_MIN) 是因为
30             // 这里的 ans 还没有乘 sign 这个正负号,所以都是非负数,自然就不能和下限进行比较了
31             ans = sign == 1 ? min(ans, (long long)INT_MAX) : min(ans, -(long long)INT_MIN);
32         }
33         // 计算正负
34         if (state == "signed") sign = c == '+'? 1 : -1;
35 
36 
37         return state;
38     }
39 };
40 
41 
42 class Solution {
43 public:
44     string state = "start";
45     int ans = 0;
46     int myAtoi(string s) {
47         Automaton automaton;
48         for (char c : s) {
49             state = automaton.output(c, state);
50         }
51         return automaton.sign * automaton.ans;
52     }
53 };

 

posted @ 2024-07-29 12:17  路人呃呃  阅读(9)  评论(0)    收藏  举报