LeetCode08、字符串转整数(atoi)

题目

在这里插入图片描述

提示:

本题中的空白字符只包括空格字符 ’ ’ 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: “42”
输出: 42
示例 2:

输入: " -42"
输出: -42
解释: 第一个非空白字符为 ‘-’, 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:

输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
示例 4:

输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。
因此无法执行有效的转换。
示例 5:

输入: “-91283472332”
输出: -2147483648
解释: 数字 “-91283472332” 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。
通过次数195,723提交次数938,532

1、直接思维——字符串正则匹配

class Solution {
    
    
    public int myAtoi(String str) {
    
    
       str=str.stripLeading();//去除首部空格
        java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^[+|-]?\\d+");//\是转义字符,需要\\表示
        java.util.regex.Matcher matcher = pattern.matcher(str);
        //System.out.println(str.matches("^[+|-]?\\d+"));
        if(matcher.lookingAt()){
    
    //匹配成功,lookingAt()部分匹配,matches()是全部匹配
            str = str.substring(0,matcher.end());
            int res;
            int Limit = Integer.MAX_VALUE;
            try{
    
    
                if(str.charAt(0)=='-'){
    
    //是负数,可能越界值为 Integer.MIN_VALUE
                    Limit = Integer.MIN_VALUE;
                }//否则为正数
                res = Integer.parseInt(str);

            }catch (NumberFormatException e){
    
    
                res = Limit;
            }
            return res;
        }else
            return 0;



    }
}

一次accept,效率感人。估计是引用了类库的问题。
在这里插入图片描述

2、非要自己造轮子的话

class Solution {
    
    
    public int myAtoi(String str) {
    
    
         //下面自己造轮子
        char[] chars = str.toCharArray();
        int start=-1;
        int flag=1;//判断是否为正数
        for (int i = 0; i < chars.length; i++) {
    
    //最多判断n次,就是全部是空格
            if(chars[i]==' '){
    
    //空格忽略
                continue;
            }
            if(chars[i]=='+'){
    
    //整数
                start = i;
                break;
            }
            if(chars[i]=='-'){
    
    //负数
                start = i;
                flag= -1;//只有这里可能是负数
                break;
            }
            if(!Character.isDigit(chars[i])){
    
    //不是数字或者+,-号开头则直接退出
                return 0;
            }
            if(Character.isDigit(chars[i])){
    
    //数字开头
                start = i;
                break;
            }
        }
        if(start<0)
            return 0;//全是空格
        if(chars[start]=='-'||chars[start]=='+') {
    
    
            start = start+1;
        }
        //也就是现在的start要么指向的是数字,要么指向的是符合

        int res=0;
        for(int i=start;i<chars.length;i++){
    
    
           if(Character.isDigit(chars[i])){
    
    //是数字则可以进行转化
               int pop = flag*(chars[i]-'0');
               //判断是否越界
               if (res > Integer.MAX_VALUE/10 || (res == Integer.MAX_VALUE / 10 && pop > 7))
                   return Integer.MAX_VALUE;
            
               if (res < Integer.MIN_VALUE/10 || (res == Integer.MIN_VALUE / 10 && pop < -8)) 
                   return Integer.MIN_VALUE;
               res = res*10+pop;//需要放后边,因为我们是先判断/10合要求了,那么它*10才会符合要求
           }else
               break;
        }
        return res;

    }
}

果然不出我所料:牛皮!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/108096397