LeetCode Brushing Notes 07 Entero inverso

Autor: Ma Zhifeng
Enlace: https: //zhuanlan.zhihu.com/p/23967316
Fuente: saber casi con
derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.

enlace

leetcode.com/problems/z

tema

Ejemplo 1: x = 123, devuelve 321
Ejemplo 2: x = -123, devuelve -321

Las reglas parecen muy simples, pero ¿ha pensado en algunos escenarios especiales?

La persona que hizo la pregunta también es muy consciente, así que primero doblé la pregunta y nos recordé que pensáramos más

Sí, piensa en las escenas especiales y luego mira hacia abajo.

Bueno, si realmente lo has pensado, aquí tienes los consejos para el título:

  1. Si los últimos bits son 0, ¿cómo debería verse nuestra salida? ¿Como 10100?
  2. ¿Sabe que el entero invertido puede desbordarse? Si es un entero de 32 bits, su valor máximo es 2147483648, entonces 1000000003 se desbordará después de la inversión. Para este caso, requerimos que la salida sea 0

Definición de función

La definición de función dada por leetcode se ve así:

class Solution {  
public:  
    int reverse(int x) {  

    }  
};

Ideas para resolver problemas

Si no se considera el desbordamiento, es fácil pensar en la idea de este tema:

  1. Para obtener el número de cada dígito, puede usar operaciones de división de enteros y resto. Debe escribir un bucle, dividiendo por 10 por primera vez y dividiendo por 100 por segunda vez. . .
  2. Para la secuencia de números resultante, multiplique el primer dígito por 1, el segundo dígito por 10 y el tercer dígito por 100. . . , Y luego sume para obtener el número de inversión

Para el desbordamiento, la forma simple y grosera es ver si intentar ... atrapar ... es adecuado

  • Si corresponde, devuelva 0 directamente en la captura.
  • Si no es adecuado, tenemos que encontrar el valor máximo del tipo entero

Pseudocódigo

x = 123;
x es el resto de 10 para obtener 3, x se divide por 10 para obtener 12,
12 es para obtener el resto de 10 y x se divide por 10 para obtener 1.
1 es para obtener el resto de 10 para obtener 1, y x se divide por 10 para obtener 0

1 * 1 + 2 * 10 + 3 * 100 = 321

Código

class Solution {  
public:  
    int reverse(int x) {  
        if (x < 10 && x > -10)  
        {  
            return x;  
        }  

        vector<int> vecDigits;  
        int iTemp = x;  
        do  
        {  
            vecDigits.push_back(iTemp % 10);  
            iTemp = iTemp / 10;  
        } while (iTemp != 0);  

        auto iSize = vecDigits.size();  
        int iFactor = 1;  
        int iResult = 0;  
        for (auto i = iSize - 1; i >= 0; --i)  
        {  
            iResult += iFactor * vecDigits[i];  
            iFactor *= 10;  
        }  

        return iResult;  
    }  
};

Después de escribir el código, sustituya x = 123 en él para verificar

Bueno, todo se ve bien.

¡Pero cuando lo envío, aparece "Error de tiempo de ejecución"! !

Si no lo entiende, puede volver atrás y mirar la página 34 de la "introducción de c ++"

Sí, hay un bucle sin fin. Tristemente. Cuando estaba leyendo, sentí que no cometería tal error. . .

class Solution {  
public:   
    int reverse(int x) {  
        if (x < 10 && x > -10)  
        {  
            return x;  
        }  

        vector<int> vecDigits;  
        int iTemp = x;  
        do  
        {  
            vecDigits.push_back(iTemp % 10);  
            iTemp = iTemp / 10;  
        } while (iTemp != 0);  

        auto i = vecDigits.size();  
        int iFactor = 1;  
        int iResult = 0;  

        while (i > 0)  
        {  
            --i;  
            iResult += iFactor * vecDigits[i];  
            iFactor *= 10;  
        }  

        return iResult;  
    }  
};

Después de enviar el código para ver, se informa el error de desbordamiento porque no hemos tratado esta situación

Después de cambiar la entrada a un número muy grande, descubrimos que no había ninguna excepción durante el tiempo de ejecución. O use el valor límite para juzgar honestamente

No pensé en una buena solución para este descubrimiento, así que miré el área de discusión.

discus.leetcode.com/to

discus.leetcode.com/to shortest

Nos referimos a uno de los códigos modificados

class Solution {  
public:  
    int reverse(int x) {  
        if (x < 10 && x > -10)  
        {  
            return x;  
        }  

        vector<int> vecDigits;  
        int iTemp = x;  
        do  
        {  
            vecDigits.push_back(iTemp % 10);  
            iTemp = iTemp / 10;  
        } while (iTemp != 0);  

        auto i = vecDigits.size();  
        long long iFactor = 1;  
        long long iResult = 0;  

        while (i > 0)  
        {  
            --i;  
            iResult += iFactor * vecDigits[i];  
            iFactor *= 10;  
        }  

        if (iResult > INT_MAX || iResult < INT_MIN)  
        {  
            return 0;  
        }  

        return iResult;  
    }  
};

Bueno, finalmente aceptado.

Pero mirando el área de discusión, podemos encontrar que los dos bucles se pueden fusionar, esto queda para todos

Además, también puede intentar convertir un número entero en una cadena ~

Supongo que te gusta

Origin blog.csdn.net/qq_26751117/article/details/53442415
Recomendado
Clasificación