面试题67_把字符串转换成整数

题目描述

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

题解一

这道题简直细节满满,在边界条件那里试错了无数次,整型总是溢出,最后用了借助了Math.addExact和try catch用来判断整型溢出。Math.addExact和普通加法的区别在于如果和溢出的时候会抛一个 ArithmeticException 异常。看来以后2147483637和-2147483648是会记住了......具体的话有以下几个步骤吧:

  1. 跳过前面的空格(如果有的话)
  2. 判断第一个字符是不是正号,如果是的话,其后一定要接数字
  3. 判断第一个字符是不是负号,如果是的话,保存标志
  4. 开始遍历数字,使用 -'0'或Character.digit()得到数字,使用Math.addExact和try catch判断整型溢出
  5. 如果不是数字,就结束这个过程,返回答案

下面是参考代码:

class Solution {
    public int strToInt(String str) {
        if (str.equals(""))
            return 0;
        int index = 0, res = 0;
        boolean negative = false;
        while (index < str.length() && (str.charAt(index) == ' ')) index++;

        // +后面一定要接数字
        if (index < str.length() && str.charAt(index) == '+') {
            index++;
            if (index < str.length() && (str.charAt(index) < '0' || str.charAt(index) > '9'))
                return 0;
        }

        // 如果是-,保存标志
        if (index < str.length() && str.charAt(index) == '-') {
            if (index > 0 && str.charAt(index-1) == '+') return 0;
            negative = true;
            index++;
        }
        while (index < str.length() && str.charAt(index) >= '0' && str.charAt(index) <= '9') {
            try {
                res = Math.addExact(Math.multiplyExact(res, 10), str.charAt(index++)-'0');
            } catch (ArithmeticException e) {
                return negative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
        }
        return negative ? -res : res;
    }
}

题解二

第二种方法是使用正则表达式,不得不说,正则表达式太强大了。

class Solution {
    public int strToInt(String str) {
        str = str.trim();
        Pattern pattern = Pattern.compile("^[\\+\\-]?\\d+");
        Matcher matcher = pattern.matcher(str);
        int value = 0;
        if (matcher.find()) {
            try {
                value = Integer.parseInt(str.substring(matcher.start(), matcher.end()));
            } catch (NumberFormatException e) {
                value = str.charAt(0) == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
        }
        return value;
    }
}

你可能感兴趣的:(面试题67_把字符串转换成整数)