leetcode8.字符串转换整数

2021-11-11  本文已影响0人  Burlong

leetcode8 字符串转换整数


/**
 * leetcode8 字符串转换整数
 *
 * 难度:medium
 *
 */
public class MyAtoi {

    public static void main(String[] args) {
        MyAtoi atoi = new MyAtoi();
        int i = atoi.myAtoi(" -4193 with words");
        System.out.println(i);
    }

    /**
     * 一步步拆,比较清晰
     * 注意的点:每一步都维护index++
     *
     * @param str
     * @return
     */
    public int myAtoi(String str) {
        if (str.length() == 0) return 0;
        int index = 0, sign = 1;
        // 1、去除空格(第一个条件是为了避免去除空格后索引越界)
        while (index <= str.length() - 1 && str.charAt(index) == ' ') {
            index++;
        }
        // 2、同理,防止越界
        if (index > str.length() - 1) {
            return 0;
        }
        // 3、处理符号
        if (str.charAt(index) == '-' || str.charAt(index) == '+') {
            sign = str.charAt(index++) == '-' ? -1 : 1;
        }
        // 4、处理数字字符串
        int res = 0;
        while (index <= str.length() - 1) {
            // 4.1:获取、判断ascii码是否在0-9范围内
            int v = str.charAt(index++) - '0';
            if (v < 0 || v > 9) break;
            // 4.2:处理越界或即将越界
            // 1、下一次*10之前,如果比最值/10大或小,则越界,直接返回最值 2、不大/小,但相等,则比较最值个位值,大于或等于最值个位值,则(即将)越界,返回最值。
            if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && v >= Integer.MAX_VALUE % 10)) {
                return Integer.MAX_VALUE;
            }
            if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && v >= -(Integer.MIN_VALUE % 10))) {
                return Integer.MIN_VALUE;
            }
            // 4.3 处理进位,加上当前个位值(每次都处理符号,方便4.2的判断)
            res = res * 10 + sign * v;
        }
        return res;
    }

}
上一篇下一篇

猜你喜欢

热点阅读