这一题其实并不算难,只是在考验细心程度而已。
这是我第一次提交的代码
class Solution {
public:
int myAtoi(string& s) {
int len = s.size();
int pre = 0;
long long ans = 0,k;
while(s[pre] == ' ')
pre ++;
if(s[pre] == '-')
{
k = -1;
pre++;
}
else if(s[pre] == '+')
{
k = 1;
pre++;
}
else if(s[pre] <= '9' && s[pre] >= '0')
{
k = 1;
}
else
{
return ans;
}
while(s[pre] == '0')
pre++;
int cur = pre;
while(s[cur] >= '0' && s[cur] <= '9'&& cur < len)
{
cur++;
}
cur--;
while(pre <= cur)
{
ans += k*(s[cur] - '0');
k*=10;
cur--;
if(ans >= INT_MAX || k > LLONG_MAX/10)
{
return INT_MAX;
}
else if(ans <= INT_MIN || k < LLONG_MIN/10)
{
return INT_MIN;
}
}
return ans;
}
};
足足写了五十多行,其中很多东西都是没有必要的。
//判断是否为数字的条件不需要写
s[pre] <= '9' && s[pre] >= '0';
//而是写成
isdigit(s[pre]);
//我写的判断正负号太复杂了
//应该把判断符号和移动pre分成两部分
//最后的else用处不大可以删掉
//变成下面这样,k初始化为1;
if(s[pre] == '-') k = -1;
if(s[pre] == '-' || s[pre] == '+') pre++;
//怎么把数字加入到ans当中
//我的方法是从后往前遍历
while(s[pre] == '0')
pre++;
int cur = pre;
while(s[cur] >= '0' && s[cur] <= '9'&& cur < len)
{
cur++;
}
cur--;
while(pre <= cur)
{
ans += k*(s[cur] - '0');
k*=10;
cur--;
if(ans >= INT_MAX || k > LLONG_MAX/10)
{
return INT_MAX;
}
else if(ans <= INT_MIN || k < LLONG_MIN/10)
{
return INT_MIN;
}
}
return ans;
}
这样的确可以解决问题,但是很麻烦,因为k也可能上溢,需要额外判断。如果写成从前往后遍历就会简单一点。
while(isdigit(s[pre]) && pre < len)
{
int num = s[pre] - '0';
if(ans > INT_MAX/10 || ans == INT_MAX/10 && num > 7) return INT_MAX;
if(ans < INT_MIN/10 || ans == INT_MIN/10 && num > 7) return INT_MIN;
ans = ans*10 + k*num;
pre++;
}
从前往后有个坑要注意,就是判断上溢时,如果ans == INT_MAX就要再判断INT_MAX的最后一位(是6)和num谁大.只有num比6大的时候才能返回INT_MAX.