1、题目描述
2、分析
请你来实现一个 atoi
函数,使其能将字符串转换成整数。需要注意的是题目中的各种限制,比如符号的处理,空字符的处理,还有超出限制长度的处理。
这道题题目中其实限制条件比较少,就按照题目中的限制条件将每一个限制写成代码就好,首先如果字符串为空就返回0。接下来遇到空字符就跳过,设置一个标志标量,用来记录正负号。接下来只有在字符是在0-9之间才进行处理,这样就跳过了字母等无意义字符,并且会在循环之外返回0。在循环内部处理所有数字,首先处理超出长度限制,如何判断长度限制,首先,因为我们最终的数字是不断的*10的,比如字符串是123那么读取到第一个字符是1,记做1,接下来读到2,那么先给1*10,再加上2,读到第三个数字3的时候,先给前面的12*10,再加上最后的3。所以我们判断这个数会不会超出限制,只要判断前一步的值是不是大于INT_MAX除以10。如果等于的话。说明这个字符串前面那些高位的数字都和最大值相同,那么就要判断最低位的数字是几,我们知道INT_MAX=2147483647,也就是最低位不能超过7。这个判断的方法最好记住。
3、代码
class Solution {
public:
int myAtoi(string str) {
if(str.empty()) return 0;
int flag=1,base=0,i=0,n=str.size();
while(i<n&&str[i]==' ') ++i;
if(i<n&&(str[i]=='+'||str[i]=='-')){
flag=(str[i++]=='+') ? 1:-1;
}
while(i<n&&str[i]>='0'&&str[i]<='9'){
if(base>INT_MAX/10||(base==INT_MAX/10&&str[i]-'0'>7)){
return (flag==1) ? INT_MAX:INT_MIN;
}
base=base*10+(str[i++]-'0');
}
return base*flag;
}
};
4、相关知识点
特殊情况的处理,判断超出长度限制的思想需要记住。