leetcode-8,真噁心

路人呃呃發表於2024-07-29

題目:

請你來實現一個 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 };

相關文章