479. Producto de números palindrómicos máximos: problemas de enumeración

¡Acostúmbrate a escribir juntos! Este es el día 16 de mi participación en el "Desafío de actualización de abril del nuevo plan diario de Nuggets", haga clic para ver los detalles del evento .

Tema Descripción

Esto es 479. Producto palindrómico máximo en LeetCode en dificultad Difícil .

Tag : "enumeración", "matemáticas"

dado un entero norte norte , el rendimiento se puede expresar como dos norte norte  El entero palíndromo más grande para el producto de enteros

Debido a que la respuesta puede ser muy grande, devuélvela por 1337 1337 Extra.

Ejemplo 1:

输入:n = 2

输出:987

解释:99 x 91 = 9009, 9009 % 1337 = 987
复制代码

Ejemplo 2:

输入: n = 1

输出: 9
复制代码

insinuación:

  • 1 < = norte < = 8 1 <= norte <= 8

Enumeración + Matemáticas

para dígitos norte norte , el número de dígitos en el producto es 2 norte 2 * norte , tampoco 2 norte 1 2 * n - 1 _

cuando digital norte > 1 norte > 1 , siempre podemos 2 norte 2 * norte .

Usando las características del palíndromo, solo necesitamos enumerar la primera mitad del palíndromo (la segunda mitad está determinada de manera única), y solo necesitamos seguir "de grande a pequeño" al enumerar la primera mitad para asegurarnos de que se encuentre. primer valor legal es el número más grande, y para un dígito es norte norte El número máximo de 1 0 norte 1 10^n - 1

具体的,当枚举到回文串的前半部分 i i 时,我们利用回文串特性构造出具实际的回文数值 norte tu metro s nums ,随后检查 n u m s nums 能否分解成数位为 n n 的数对 ( a , b ) (a, b) ,利用乘法具有交换律,我们只需要枚举数对中的较大数即可。

代码:

class Solution {
    public int largestPalindrome(int n) {
        if (n == 1) return 9;
        int max = (int) Math.pow(10, n) - 1;
        for (int i = max; i >= 0; i--) {
            long num = i, t = i;
            while (t != 0) {
                num = num * 10 + (t % 10);
                t /= 10;
            }
            for (long j = max; j * j >= num; j--) {
                if (num % j == 0) return (int)(num % 1337);
            }
        }
        return -1;
    }
}
复制代码
  • 时间复杂度:枚举回文串的前半部分复杂度为 O ( 1 0 n ) O(10^n) ;检查回文串能否被分解复杂度为 O ( 1 0 n ) O(10^n) 。整体复杂度为 O ( 1 0 2 n ) O(10^{2n})
  • 空间复杂度: O ( 1 ) O(1)

最后

Este es el primer No.479artículo serie comienza el 01/01/2021. A partir de la fecha de inicio, hay 1916 preguntas en LeetCode, algunas de las cuales están bloqueadas. Primero pondremos todas las preguntas sin cerraduras Tema terminado.

En esta serie de artículos, además de explicar las ideas de resolución de problemas, se dará el código más conciso posible. Si se trata de soluciones generales, también se proporcionarán las plantillas de código correspondientes.

Para facilitar a los estudiantes la depuración y el envío de código en la computadora, he establecido un repositorio relacionado: github.com/SharingSour… .

En la dirección del almacén, puede ver el enlace a la solución de la serie de artículos, el código correspondiente de la serie de artículos, el enlace a la pregunta original de LeetCode y otras soluciones preferidas.

Supongo que te gusta

Origin juejin.im/post/7087026602332127246
Recomendado
Clasificación