题目描述
实现函数 atoi 。函数的功能为将字符串转化为整数
提示:仔细思考所有可能的输入情况。这个问题没有给出输入的限制,你需要自己考虑所有可能的情况。
方法一:遍历的方法
求解思路
对于本题目所给出的条件,由于对输入没有任何限制,因此参考部分作者的思路,写出如下需要注意的几点。
1、前缀0和空格要全部去掉
2、判断第一个符号为正号or负号的情况
3、输入非数字的处理
4、输入的数字超过了int类型的范围
5、空串的情况
然后我们根据上述情况,用index记录字符串的下表,按照上述的情况进行逐个字符的判断,然后求得结果。
解题代码
class Solution { public: int atoi(const char *str) { string mys = str; // 转换为string类型 int n = mys.length(); int index = 0; //遍历字符串的下标 while(index < n) { if (str[index] != ' ') break; index++; } if(index == n) // 考虑特殊情况,返回0 return 0; int sign = 1; // 处理第 1 个非空字符为正负符号 if(mys[index] == '+') index++; else if(mys[index] == '-') { sign = -1; index++; } int myres = 0; while(index < n) { char c = mys[index]; if(c < '0' || c > '9') //非数字跳出 break; //int型最大最小 if(myres > INT_MAX / 10 || (myres == INT_MAX / 10 && (c - '0') > INT_MAX % 10)) return INT_MAX; if(myres < INT_MIN / 10 || (myres == INT_MIN / 10 && (c- '0') > -(INT_MIN % 10))) return INT_MIN; myres = myres * 10 + sign * (c - '0'); index++; } return myres; // 返回结果 } };
复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:没有引入额外的内存地址空间,因此空间复杂度为
方法二:状态机的思想求解
求解思路
对于本题目的求解,我们可以采用状态机的思想进行求解。对于字符串,我们将空格映射成数字0,数字0映射为数字1,数字1-9映射成数字2,其他非法字符映射成数字3,正负号映射成数字4。并且根据他们之间的关系,我们有如下状态机的关系:
解题代码
class Solution { public: int atoi(const char *str) { string s = str; // 转换为string类型 vector<vector<int> > sta = { {0,1,2,3,1}, {3,1,2,3,3}, {3,2,2,3,3}, }; // 状态转移矩阵 long myres = 0; // 存储结果 long top = INT_MAX; // 与int边界比较 long bottom = INT_MIN; int n = s.length(); int sign = 1; int state = 0; // 状态从“ ”开始 for(int i = 0; i < n; i++) { char c = s[i]; if(c == ' ') state = sta[state][0]; // 映射成数字0 else if(c == '0') state = sta[state][1]; // 映射成数字1 else if(c >= '1' && c <= '9') state = sta[state][2]; // 映射成数字2 else if(c == '-' || c == '+'){ state = sta[state][4]; // 映射成数字4 if(state == 1) sign = (c == '-') ? -1 : 1; else break; }else state = sta[state][3]; // 映射成数字3 if(state == 2) { myres = myres * 10 + int(c - '0'); myres = (sign == 1) ? min(myres, top) : min(myres, -bottom); // 越界处理 } if(state == 3) break; } return (int)sign * myres; // 返回结果即可 } };
复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:没有引入额外的内存地址空间,因此空间复杂度为