Inversión de enteros LeetCode 07

Inversión de enteros


Enlace de tema:

https://leetcode-cn.com/problems/reverse-integer/

Descripción del Título

Dado un entero de 32 bits con signo, es necesario invertir los dígitos de cada uno de los números enteros.

Nota: Suponiendo que nuestro entorno solo puede almacenar enteros de 32 bits con signo, el rango de valores es [−2 ^ 31, 2 ^ 31 - 1]. De acuerdo con esta suposición, si el entero se desborda después de la inversión, devuelve 0.

Ejemplo:

Ejemplo 1:
Entrada: 123
Salida: 321


Ejemplo 2:
Entrada: -123
Salida: -321


Ejemplo 3:
Entrada: 120
Salida: 21

Tema detallado

Esta pregunta requiere que invirtamos un número entero con signo, es decir, el número 64 se convertirá en 46 después de la inversión, el dígito de las unidades se invierte al dígito de las decenas y el dígito de las decenas se invierte a un solo dígito. Si el entero dado es negativo, el signo del entero no se puede cambiar. Debemos prestar atención a los siguientes puntos de esta pregunta:

  • Los enteros tendrán números negativos;
  • El entero con signo requerido en la pregunta es un entero de 32 bits (el rango de valor de un entero de 32 bits: -2147483648 ~ 2147483647, más allá de este rango hay un desbordamiento), si se produce un desbordamiento después de invertir el entero, entonces se debe devolver 0;
  • Si el último bit es 0, debe descartarse. Por ejemplo, después de invertir 120, se convierte en 21.

Plan de resolución de problemas

Idea 1: Complejidad temporal: O (lgx) Complejidad espacial: O (1)

Lo que necesita atención cuando se invierten números es el problema de desbordamiento.

El rango de valores de nuestro tipo int es -2147483648 ~ 2147483647 (-2 ^ 31 ~ 2 ^ 31-1) , entonces si queremos invertir el número dentro del rango de 1000000003 , obtenemos 3000000001 , pero el número después del cambio excede el rango , Esta situación es de desbordamiento, en este momento el programa devuelve 0.

Si la entrada es un número negativo, la función original se llama de forma recursiva y el parámetro se convierte en -x. El flujo de ejecución de código aproximado es el siguiente:

  1. Primero juzgue si x es un número negativo, si es un número negativo, primero tome el valor absoluto y luego invierta de forma recursiva , y finalmente convierta el resultado en un número negativo;
  2. res es el resultado final, inicialmente igual a 0. x% 10 (por ejemplo: 123% 10 = 3) Tome el último dígito. Obtenga el último dígito cada vez y utilícelo como el dígito más alto actual en el resultado;
  3. Determine si el resultado res es un desbordamiento y devuelva 0 si se desborda.

El código detallado es el siguiente:

public class Solution {
    
    

    /**
     * 时间复杂度: O(lgx) 空间复杂度: O(1)
     * @param x 目标值
     * @return int
     */
    public static int reverse(int x) {
    
    
        if (x == -2147483648) {
    
     //如果不做这个判断,下面的x=-x将会报错
            return 0;
        }

        if (x < 0) {
    
     // 判断是否为负数
            return -reverse(-x); // 如果是负数则取绝对值调用自身,最后将结果转为负数
        }

        int res = 0;
        while (x != 0) {
    
     // 每次得到最后一位数字,并将其作为结果中的当前最高位
            if (res > 214748364) {
    
     // 处理溢出
                return 0;
            }
            res = res * 10 + x % 10;
            x /= 10;
        }
        return res <= Integer.MAX_VALUE ? res : 0; // 如果溢出就返回0
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_38478780/article/details/108419439
Recomendado
Clasificación