大致思路描述:
题目写的有些复杂,但通过阅读我们发现处理主要分为以下部分:
1、首先处理空格。当字符串最开始有空格存在时,把这些空格都跳过,很明显我们需要使用一个while循环.
2、其次处理符号。‘+’和没有符号为正,‘-’为负。
3、处理数字部分。只需要提取数字,当遇到非数字时停止即可,这里要注意s中存放的是字符,所以需要把字符转化为数字,即减去48(因为字符‘0’的十进制是48),详见下表。
4、判断是否溢出。如果溢出按照要求舍去就可以了。这里强调,在此代码逻辑中,一定不可以在循环中发现溢出并跳出的时候就舍去,因为我们是运算完数字才进行的符号运算,比如:
如果我们最后应该转化得到的正确结果为”2147483648“(即2^31),此时如果我们在break之前先舍入为2^31-1(即2147483647),然后再进行res=res*flag的操作,结果就会变为”-214748647”,结果错误。
解答:
class Solution {
public:
int myAtoi(string s) {
long long int res=0;
int i=0;
long long int temp=pow(2,31);
while(s[i]==' '){
i++;
}
int flag=1;
if(s[i]=='-') {
flag=-1;
i++;
}
else if (s[i]=='+')
i++;
while(s[i]>='0'&&s[i]<='9'){
int t=s[i]-48;
res=res*10+t;
i++;
if(res>temp-1) break;/此处不可以舍入,原因见上文
}
res=res*flag;
if(res<-temp) res=-temp;
else if(res>temp-1) res=temp-1;
return res;
}
};