题目: 实现stoi; 无法转换的情况,return 0:① str为空 ② 只有空格 ③ 没有数字 ④ 第一个有效字符不是正负号或者数字 若数值超过int的范围,就返回INT_MIN和INT_MAX,根据第一个有效字符位’+’,’-决定,若没有正负号,按正数算; 思路: 1.模拟遍历:时间O(n):最多需要遍历一次,如果无法转换的话,会在中间结束,空间O(1)
class Solution {
public:
int strToInt(string str) {
if (str.empty()) return 0;
int n = str.size();
int i = 0;
while (i < n && str[i] == ) ++i;//跳过开头空格;
if (str[i] == ) return 0;//str只有空格
int symbol = 0;//标识正负号
if (str[i] == +) {
symbol = 1;
if (++i < n && !(str[i] >= 0 && str[i] <= 9)) return 0;//正负号后面没数字
}
else if (str[i] == -) {
symbol = -1;
if (++i < n && !(str[i] >= 0 && str[i] <= 9)) return 0;//正负号后面没数字
}
else if (str[i] >= 0 && str[i] <= 9) ;
else return 0; //第一个有效字符不是+,-,数字
long res = 0;//结果
int maxVal = INT_MAX;//边界值
for (; i < n; ++i) {
//初始i一定停在第一个数字上
if (str[i] >= 0 && str[i] <= 9) {
res = res * 10 + (str[i] - 0);
if (res > maxVal) {
//我们跳过了符号,都是按正数算的,最后再考虑正负号
if (symbol == 0 || symbol == 1) return INT_MAX;//没出现+-号就默认按正数算
else return INT_MIN;
}
}
else break;//出现数字以外的其他字符就停止
}
return (symbol == 0 || symbol == 1) ? res : (-1) * res;//没出界的int值,根据符号输出正数/负数
}
};
总结: atoi和stoi:差别在于参数不同,stoi参数是string,atoi是const char*,但二者都可以转成 int ,long,long long,只需把to后面改成i,l,ll即可