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