


这道题是典型的模拟题,考察各种情况的处理,总结起来如下:
- 前导空格:删除即可
- 符号位:有“+”、“-”、“无符号”三种,新建符号位根据不同情况保存即可
- 非数字字符:遇到首个非数字字符,直接返回
- 数字字符:
- 字符转数字:ASCII码相减即可
- 数字拼接:res为保存的结果,当前位数字为x,则每次计算为 res = res * 10 + x
数值溢出处理:
题目给定的数字范围是int类型的左右边界,那么我们必须要判断每次拼接之后是否有溢出。
在每轮数字拼接前,判断 res 在此轮拼接后是否超过 2147483647 ,若超过则加上符号位直接返回。
设数字拼接边界 bndry=2147483647/10=214748364 ,则以下两种情况越界:
为什么要有 bndry 呢?因为计算res是 res = res * 10 +x,提前判断在res乘10前是否超过了 bndry 的值即可判断。
x > 7 的理解是,当 res == bndry 时,如果 res 此时再乘 10 即为2147483640,如果下一位的位数字超过7,就大于了Integer.MAX_VALUE,同样溢出
最终代码为:
class Solution {
public int myAtoi(String s) {
char[] array = s.trim().toCharArray();
if (array.length == 0) return 0;
int res = 0, bndry = Integer.MAX_VALUE / 10;
int sign = 1, i = 1;
if (array[0] == '-') sign = -1;
else if (array[0] != '+') i = 0;
for (; i < array.length; i++) {
if (array[i] < '0' || array[i] > '9') break;
if (res > bndry || res == bndry && array[i] > '7') {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
res = res * 10 + (array[i] - '0');
}
return sign * res;
}
}