水题。需要注意的是特殊情况考虑。一是前面的空格,二是最后的非数字字符,三是正负符号(我考虑了负号,忘记了正号),四是溢出,而且溢出还分两种,一是2147483649这样的溢出,二是10000000000这样的溢出,多一位(我只考虑了一种)。五是空字符串。最终代码pass,但其实还忘了处理null。
代码如下:
public class Solution {
public int atoi(String str) {
// Start typing your Java solution below
// DO NOT write main() function
int ans = 0;
int i = 0;
boolean neg = false;
boolean overflow = false;
int len = str.length();
while (i < len && str.charAt(i) == ' ') i ++;
// the first char
if (i < len && str.charAt(i) == '-')
{
neg = true;
i++;
}
if (i < len && str.charAt(i) == '+')
{
neg = false;
i++;
}
while (i < len && str.charAt(i) >= '0' && str.charAt(i) <= '9')
{
int d = str.charAt(i) - '0';
if (ans >= 214748364)
{
if ((!neg && d >= 7) || neg && d >= 8 || (ans >= 1000000000))
{
overflow = true;
break;
}
}
ans = ans * 10 + d;
i++;
}
if (overflow)
{
if (!neg) return Integer.MAX_VALUE;
else return Integer.MIN_VALUE;
}
if (neg) return ans * (-1);
else return ans;
}
}
另外对溢出的判断还可以用类似下面的代码:
if (INT_MAX / 10 >= ret)
ret *= 10;
else
return sign == -1 ? INT_MIN : INT_MAX;
if (INT_MAX - digit >= ret)
ret += digit;
else
return sign == -1 ? INT_MIN : INT_MAX;