水题。需要注意的是特殊情况考虑。一是前面的空格,二是最后的非数字字符,三是正负符号(我考虑了负号,忘记了正号),四是溢出,而且溢出还分两种,一是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;