剑指offer-67、字符串转换整数

本题主要是对多种输入情况的讨论:

  • 首部空格:删除即可;

  • 符号位:三种情况,”+“,”-“,”无符号“;新建一个变量保存符号位,返回前判断正负即可。

  • 非数字字符:遇到首个非数字的字符时,应立即返回。

  • 数字字符

    • 字符转数字:遇到首个非数字的字符时,应立即返回。
    • 数字拼接:res = res * 10 + ascii(c) - ascii('0')
  • 数字越界处理:判断res在此轮拼接后是否超过2147483647,若超过,则加上符号位直接返回。

    • 设数字拼接边界 bound = 2147483647 // 10 = 214748364 ,则以下两种情况越界:
      • res>bound 执行拼接res *10>= 2147483650
      • res=bound, c>'7' 执行拼接后是2147483648或2147483649
class Solution {
    public int strToInt(String str) {
        char[] arr = str.trim().toCharArray();
        if (arr.length == 0) {//字符串长度为0
            return 0;
        } 
        int res = 0;
        int bound = Integer.MAX_VALUE / 10;
        int index = 1;//若有正负号,则数字位从index = 1开始
        int sign = 1;//标记正负号
        if (arr[0] == '-') {
            sign = -1;
        } else if (arr[0] != '+') {//无正负号情况
            index = 0;//数字为从1开始
        }
        for (int i = index; i < arr.length; i++) {
            if (arr[i] < '0' || arr[i] > '9') {//非数字字符
                break;
            }
            if (res > bound || (res == bound && arr[i] > '7')) {//越界分为两种情况
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            res = res * 10 + arr[i] - '0';
        }
        return sign * res;
    }
}
posted @ 2022-05-13 11:56  Arthurma  阅读(16)  评论(0编辑  收藏  举报