¿Cuál es la forma lógica de resolver el problema SPOJ ‘Palin’?

Antes de comenzar, sepa que mi enfoque no es necesariamente la forma más optimizada de resolver esto. También estoy abierto a cualquier comentario.

La declaración del problema:

Un entero positivo se llama palíndromo si su representación en el sistema decimal es la misma cuando se lee de izquierda a derecha y de derecha a izquierda. Para un entero positivo dado K de no más de 1000000 dígitos, escriba el valor del palíndromo más pequeño más grande que K para la salida. Los números siempre se muestran sin ceros a la izquierda.

Entrada
La primera línea contiene el entero t , el número de casos de prueba. Los enteros K se dan en las siguientes líneas t .

Salida

Para cada K , produzca el palíndromo más pequeño más grande que K.

Como sabemos que los palíndromos son esencialmente un espejo de todos los dígitos sobre el dígito central, podemos tomar la entrada, cortarla por la mitad y reflejarla. Entonces la entrada 810 pasará por las siguientes transformaciones:

810 -> 81 -> 818

¿Este método siempre produce el próximo palíndromo? No. Un ejemplo que falla es 123.

123 -> 12 -> 121

La respuesta válida es 131.

El algoritmo actual necesita una ligera modificación. Es decir, antes de reflejarlo, necesitamos aumentar el dígito central en uno. Entonces, para el caso de prueba fallido, ahora tenemos:

123 -> 12 -> 13 -> 131

Sin embargo, para 810, tenemos:

810 -> 81 -> 82 -> 828

La respuesta correcta es, por lo tanto, min (método 1, método 2).

Tenga en cuenta que hay un caso límite para el segundo método. Tome 190 como ejemplo:

190 -> 19 -> 10 (*) -> 101

Dado que sumar 1 a 9 produce un acarreo, debemos contabilizarlo agregando ese 1 al siguiente dígito (s).

Espero que responda tu pregunta. Aquí está mi implementación que puede usar como referencia: wrahman0 / palin.cc


* asumiendo que subes a 9 y luego vuelves a 0

Aborde el problema de la siguiente manera: primero convierta el número a un palíndromo. Luego, si es necesario, incremente gradualmente el número para obtener un palíndromo más grande.

Entrada: 87654

Ahora, para hacer de este número un palíndromo, copiemos la primera mitad en la segunda mitad.

Nuevo número: 87678.

Ahora este número es el siguiente palíndromo más grande de 87654.

En este caso, todos los números en la primera mitad fueron mayores que los números en la segunda mitad, por lo que no se requirió más procesamiento.

Ahora tome el caso del número: 1234.

Para hacer que este número palíndromo vuelva a copiar la primera mitad en la segunda mitad.

Nuevo número: 1221.

Ahora esto es menor que nuestro número original. El truco aquí es que, para obtener el siguiente palíndromo más grande, incrementamos gradualmente el número a partir del medio y nos propagamos al principio y al final, respectivamente, hasta obtener un número mayor que el original. Como queremos el siguiente más grande, simplemente agregamos 1.

Al hacerlo, nos da: 1331, que es el próximo palíndromo.

Sin embargo, tenemos un caso especial aquí si el o los dígitos centrales son 9, en cuyo caso reemplazamos el 9 con 0 y llevamos 1 para el resto de los dígitos hasta que alcancemos un dígito que sea menor que 9 o alcancemos El principio / fin.

Si alcanzamos un dígito que es menor que 9, le sumamos 1 y su dígito espejo (al convertir el número en un palíndromo)

Por ejemplo: 19995-> 19991-> 20002

Si llegamos al principio / final (lo que significa que todos los dígitos fueron 9), agregamos 1 al principio y hacemos que el último dígito también sea 1.

9999-> 10000-> 10001.

More Interesting

En C, el nombre de la matriz denota la dirección del elemento cero de la matriz. ¿Es esto solo una regla, o tiene alguna razón asociada?

¿Cómo eliminará elementos de manera eficiente mientras itera una Colección?

¿Cómo idearé un algoritmo eficiente para determinar todos los cursos que debo tomar antes de un curso en particular sin un orden topológico?

¿Son suficientes los tutoriales del codificador superior de la estructura de datos y los algoritmos para obtener una base sólida en la programación?

¿Dónde encuentro los mejores recursos para aprender algoritmos y estructuras de datos?

Dada una matriz 2D de valores booleanos, ¿cuál es la forma correcta de determinar si contiene un triángulo?

¿Cuál es la diferencia entre la implementación vinculada y la implementación contigua en listas?

Si T (1) = 2 y T (n) viene dado por T (n / 2) + c para n> 1, ¿cómo calcula la complejidad del algoritmo?

¿Debo aprender primero "el lenguaje de programación que elegí" o "algoritmo y estructura de datos"?

¿Cuál es la mejor manera de escribir un programa Java que pueda encontrar la derivada de una ecuación a partir de una cadena?

¿Por qué usar un diagrama de flujo es una mala práctica en la programación?

¿Debería un principiante construir cosas y contribuir a proyectos de código abierto antes de aprender algoritmos?

¿Existe un algoritmo en línea para calcular la mediana de una secuencia de números si los elementos de la secuencia se pueden agregar o eliminar en cualquier momento?

¿Cuál es la intuición de que la factorización no es NP completa?

¿Podemos construir un sistema utilizando algoritmos de aprendizaje automático que puedan reemplazar a todas las empresas de consultoría financiera y técnica del mundo?