LeetCode08, cadena a entero (atoi)

tema

Inserte la descripción de la imagen aquí

rápido:

Los caracteres en blanco en esta pregunta solo incluyen el carácter de espacio ''.
Suponiendo que nuestro entorno solo puede almacenar enteros de 32 bits con signo, el rango de valores es [−231, 231 - 1]. Si el valor excede este rango, devuelva INT_MAX (231 - 1) o INT_MIN (−231).

Ejemplo 1:

Entrada: "42"
Salida: 42
Ejemplo 2:

Entrada: "-42"
Salida: -42
Explicación: El primer carácter que no está en blanco es'- ', que es un signo negativo.
Hacemos nuestro mejor esfuerzo para combinar el signo menos con todos los números subsiguientes y finalmente obtenemos -42.
Ejemplo 3:

Entrada: "4193 con palabras"
Salida: 4193
Explicación: La conversión termina en el número '3' porque el siguiente carácter no es un número.
Ejemplo 4:

Entrada: "palabras y 987"
Salida: 0
Explicación: El primer carácter que no está en blanco es 'w', pero no es un número ni un signo positivo o negativo.
Por lo tanto, no se puede realizar una conversión efectiva.
Ejemplo 5:

Entrada: "-91283472332"
Salida: -2147483648
Explicación: El número "-91283472332" excede el rango de un entero de 32 bits con signo.
Por lo tanto, se devuelve INT_MIN (−2 31 ).
Aprobado 195,723 Enviado 938,532

1. Emparejamiento regular directo de la cadena de pensamiento

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;



    }
}

Una vez aceptado, la eficacia es conmovedora. Se estima que el problema de citar la biblioteca de clases.
Inserte la descripción de la imagen aquí

2. Si tienes que hacer tus propias ruedas

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;

    }
}

Como era de esperar: ¡piel de vaca!

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_44861675/article/details/108096397
Recomendado
Clasificación