剑指 Offer 第67题:把字符串转换成整数

1、前言

题目描述

2、思路

这个题目有两个比较重要的思路:
1)先处理前后的空格(使用 trim() 函数即可,或者手动一个个处理)。此时前后没有空格,开始判断第一个符号是否是正负数,如果是负数则记录符号,正数也记录一下。
2)越界使用 MAX / 10 的方式提前判断。

后面的处理就简单了,只需要一个个遍历,直到遇到不是数字直接 break,最后的结果就是数字 * 符号。

3、代码

class Solution {
    public int strToInt(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }

        char[] array = str.trim().toCharArray();
        if (array.length == 0) {
            return 0;
        }
        int res = 0, sign = 1;
        int i = 0, boundary = Integer.MAX_VALUE / 10;

        if(array[0] == '-'){
            sign = -1;
            i++;
        }else if(array[0] == '+'){
            i++;
        }

        for(int j = i; j < array.length; j++){
            if(array[j] < '0' || array[j] > '9'){
                break;
            }
            // max = 2147483647, min = -2147483648。
            // 结果都大于 max / 10,说明乘10肯定大于 max。
            // 结果等于 max / 10,如果后面位数大于7,则说明大于 max;且可能等于或者大于 min(没乘负数),则直接返回最大最小
            if(res > boundary || (res == boundary && array[j] > '7')){
                return sign == -1 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
            
            res = res * 10 + (array[j] - '0');
        }

        return res * sign;
    }
}

你可能感兴趣的:(剑指 Offer 第67题:把字符串转换成整数)