image.png

思路简述:
分为两个模块

  1. 处理出需要的有效数字
  2. 累减法处理字符转大数,借鉴标准库 Integer.parseInt
class Solution {
    public int myAtoi(String s) {
        // 转换为字符数组
        char[] chs = s.toCharArray();

        // 判断符号
        // 截取数字部分
        // 累减法转换成数字

        int len = chs.length;
        char[] num = new char[len]; // 初始化数组
        int index = 0; // 有效数字位
        int sign = 0;  // -1负数/0未初始化/1正数
        for (char c : chs) {
            // 丢弃空格
            if (c == ' ') {
                if (sign == 0) {
                    continue;
                } else {
                    // 第二个空格
                    break;
                }
            }

            // 非数字处理
            if (c > '9' || c < '0') {
                // 如果是符号
                if (c == '-' || c == '+') {
                    // 已经初始化,不需要符号
                    if (sign != 0) break;
                    else {
                        // 获取符号位
                        sign = c == '-' ? -1 : 1;
                        continue;
                    }
                } else {
                    break;
                }
            }

            // 如果没有符号,则默认为正数
            if (sign == 0) sign = 1;

            // 数字处理,index标识有效数字个数,每添加一个+1
            num[index++] = c;

        }
	// 如果没有有效数字则返回 0
        if (index <= 0) return 0;
        return convert(num, index, sign >= 0);

    }

    // 参照Integer.parseInt 方法
    // 累减法迫近极限
    public int convert(char[] chs, int index, boolean positive) {
        // 数字部分,有效数字位,是否为正数
        int result = 0;
        int limit = positive ? -Integer.MAX_VALUE : Integer.MIN_VALUE;
        for (int i = 0; i < index; i++) {
            int digit = chs[i] - '0';
            if (limit / 10 > result ||10 * result < limit + digit) {
                // 超出边界值
                return positive ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            // 十进制,升位 * 10
            result *= 10;
            // 如果未超边界,继续累减
            result -= digit;
        }

        return positive ? -result : result;

    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹