LeetCode8.字符串转换整数(atoi)
LeetCode8.字符串转换整数(atoi)

LeetCode8.字符串转换整数(atoi)

这道题是典型的模拟题,考察各种情况的处理,总结起来如下:

  1. 前导空格:删除即可
  2. 符号位:有“+”、“-”、“无符号”三种,新建符号位根据不同情况保存即可
  3. 非数字字符:遇到首个非数字字符,直接返回
  4. 数字字符:
    • 字符转数字:ASCII码相减即可
    • 数字拼接:res为保存的结果,当前位数字为x,则每次计算为 res = res * 10 + x


数值溢出处理

题目给定的数字范围是int类型的左右边界,那么我们必须要判断每次拼接之后是否有溢出。

在每轮数字拼接前,判断 res 在此轮拼接后是否超过 2147483647 ,若超过则加上符号位直接返回。
设数字拼接边界 bndry=2147483647/10=214748364 ,则以下两种情况越界:

\(\left\{\begin{matrix} res > bndry \\ res = bndry , x > 7\end{matrix}\right.\)

为什么要有 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;
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注