Leetcode8. Conversión número entero de cuerdas

título Descripción

Por favor venga a poner en práctica una atoifunción, que puede convertir una cadena a un entero.

En primer lugar, la función se iniciará con un carácter de espacio descarta inútil si es necesario, hasta que el hallazgo al primer carácter no-espacio hasta ahora. Las siguientes reglas de conversión son como sigue:

  • Si el primer carácter es un positivo no nulo o número negativo, la señal de la vuelta con tantos caracteres numéricos consecutivos se combinan para formar un entero con signo.
  • Si el primer carácter no-espacio es un número, que es directamente después de los caracteres numéricos continuos se combinan para formar un entero.
  • La cadena también puede existir después de la parte entera de los caracteres adicionales eficaces, estos caracteres pueden ser ignorados, no deben afectar a la función.

Nota : Si la cadena cuando el primer carácter que no sea espacio no es una cadena de caracteres entero válido está vacío o contiene sólo la cadena de caracteres de espacio en blanco, la función no requiere que usted para convertir esa conversión no puede ser eficaz.

En cualquier caso, si la función no puede convertir de manera efectiva, se devuelve 0.

consejos:

  • El título de los espacios en blanco, incluyendo sólo los caracteres de espacio ' '.
  • Suponemos que el medio ambiente puede almacenar 32 bits de tamaño entero con signo, entonces el rango numérico [-231 231 a -1]. Si el valor excede este rango, volver INT_MAX (231 - 1) o INT_MIN (-231).

Ejemplo 1:

De entrada: "42"
de la salida: 42

Ejemplo 2:

De entrada: "-42"
de salida: -42
Explicación: un primer caracter no blanco '-', es un signo negativo.
  Vamos a todos los digitales número negativo consecutivo y más tarde se combina tanto como sea posible, y, finalmente, conseguir -42.

Ejemplo 3:

De entrada: "palabras y 987"
de salida: 0
Explicación: una primera de carácter no en blanco 'w', pero no es un número positivo o número negativo.
Por lo tanto, la conversión no se puede realizar de manera eficaz.

Ejemplo 4:

De entrada: "-91,283,472,332"
Salida: -2147483648
explicación: el número "-91,283,472,332" Por encima del rango de número entero con signo de 32 bits.
  Así que volver INT_MIN (-231).

Descripción:

solución del problema

No sé Jiaosha, una ley sobre el acto II de barras.

Un método (Java)

Ideas: paso a paso, de acuerdo con el objeto de la solicitud para eliminar el espacio, y luego se determina el símbolo, y, finalmente, el procesamiento es digital. La parte problemático mayor parte del valor límite que se determina, más difícil de resolver. Se podrá hacer referencia a la práctica como hermano mayor, la operación a un lado, para asegurar que en el caso de no superar el máximo, se determina si o no fuera de rango.
Consejo: El método de llevar a tantos como sea posible, como Character.isDigit (char c) para determinar si los caracteres numéricos c. Str.trim o directamente al sujeto () para eliminar la cadena de cadena de caracteres espacios finales;


public class Solution {
    public int myAtoi(String str) {
        char[] chars = str.toCharArray();
        int n = chars.length;
        int idx = 0;
        while (idx < n && chars[idx] == ' ') {
            // 去掉前导空格
            idx++;
        }
        if (idx == n) {
            //去掉前导空格以后到了末尾了
            return 0;
        }
        boolean negative = false;
        if (chars[idx] == '-') {
            //遇到负号
            negative = true;
            idx++;
        } else if (chars[idx] == '+') {
            // 遇到正号
            idx++;
        } else if (!Character.isDigit(chars[idx])) {
            // 其他符号
            return 0;
        }
        int ans = 0;
        while (idx < n && Character.isDigit(chars[idx])) {
            int digit = chars[idx] - '0';
            if (ans > (Integer.MAX_VALUE - digit) / 10) {
                // 本来应该是 ans * 10 + digit > Integer.MAX_VALUE
                // 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
                return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
            ans = ans * 10 + digit;
            idx++;
        }
        return negative? -ans : ans;
    }
}

Análisis de la complejidad

  • Complejidad de tiempo: la ( norte ) O (N)
  • Espacio de la complejidad: la ( 1 ) O (1)

Método II (java)

Ideas: De hecho, una idea similar, pero esta vez será un poco más rápido, prestar atención a si num aumento en un 10 o puedan estar fuera de límites, por lo que necesitamos para determinar si los dos están fuera de los límites.


class Solution {
    public int myAtoi(String str) {
        //去掉str首尾的空格
        str = str.trim();
        if (str.length() == 0) {
            return 0;
        }
        char[] chars = str.toCharArray();
        int min = -2147483648;
        int max = 2147483647;
        int flag = 0;
        int sum = 0;
        
        if ((int) chars[0] == 45) {
            flag = 1;
        } else if ((int) chars[0] == 43) {
            flag = 0;
        } else if ((int) chars[0] < 48 || (int) chars[0] > 57) {
            return 0;
        } else {
            sum = (int) chars[0] - (int) ('0');
        }
        for (int i = 1; i < chars.length; i++) {
            if ((int) chars[i] < 48 || (int) chars[i] > 57) {
                break;
            }
            int num = (int) chars[i] - (int) ('0');
            if (flag == 0 && sum > max / 10) {
                return max;
            }
            if (flag == 1 && -sum < min / 10) {
                return min;
            }
            sum = sum * 10;
            if (flag == 0 && sum > max - num) {
                return max;
            }
            if (flag == 1 && -sum < min + num) {
                return min;
            }
            sum = sum + num;
        }
        if (flag == 1) {
            return -sum;
        }
        return sum;
    }
}

Análisis de la complejidad

  • Complejidad de tiempo: O ( N ) O (N)
  • Espacio de la complejidad: O ( 1 ) O (1)

03/04/2020

Publicado 43 artículos originales · alabanza ganado 20 · vistas 1437

Supongo que te gusta

Origin blog.csdn.net/Chen_2018k/article/details/105304192
Recomendado
Clasificación