题目:
请你来实现一个 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 };