题目描述
实现函数 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; // 返回结果即可
}
};复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:没有引入额外的内存地址空间,因此空间复杂度为

京公网安备 11010502036488号