美文网首页
面试题67_把字符串转换成整数

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

作者: shenghaishxt | 来源:发表于2020-04-01 16:03 被阅读0次

    题目描述

    请你来实现一个 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_把字符串转换成整数

          本文链接:https://www.haomeiwen.com/subject/lqiouhtx.html