¿Cómo verifico si un número es un palíndromo?
Cualquier idioma. Cualquier algoritmo (excepto el algoritmo de convertir el número en una cadena y luego invertir la cadena).
algorithm
language-agnostic
Esteban Araya
fuente
fuente
number
y quéis a palindrome
significará en este contexto: ¿qué tal 13E31 (base diez)? 01210 (cero a la izquierda)? + 10-10 + 1 (ternario balanceado de cinco dígitos)?Respuestas:
Este es uno de los problemas del Proyecto Euler . Cuando lo resolví en Haskell, hice exactamente lo que sugieres, convertir el número en una cadena. Entonces es trivial comprobar que la cadena es un palíndromo. Si funciona lo suficientemente bien, ¿por qué molestarse en hacerlo más complejo? Ser un palíndromo es una propiedad léxica más que matemática.
fuente
to describe an algorithm to convert an integer to a string, which of course requires you to understand modulo
- no. Calcular en el sistema de números objetivo, ser capaz de sumar será suficiente (piense cómo se convierte comúnmente de decimal a binario; se usa para pensar que el cálculo significa que binario no significa que no pueda hacer, por ejemplo, aritmética decimal (y puede hacer conversión de binario a decimal sin división o módulo 2).Para cualquier número dado:
Si
n == rev
entoncesnum
es un palíndromo:fuente
num
después de la división (escritura más flexible), deberá hacerlonum = floor(num / 10)
.Funciona solo para enteros. No está claro a partir del enunciado del problema si se deben considerar los números de coma flotante o los ceros iniciales.
fuente
Por encima de la mayoría de las respuestas que tienen un problema trivial es que la variable int posiblemente podría desbordarse.
Consulte http://articles.leetcode.com/palindrome-number/
fuente
fuente
Empuje cada dígito individual en una pila, luego sáquelos. Si es lo mismo hacia adelante y hacia atrás, es un palíndromo.
fuente
No noté ninguna respuesta que resolviera este problema sin usar espacio adicional, es decir, todas las soluciones que vi usaban una cadena u otro número entero para revertir el número u otras estructuras de datos.
Aunque los lenguajes como Java se desbordan en el desbordamiento de enteros, este comportamiento no está definido en lenguajes como C. ( Intente revertir 2147483647 (Integer.MAX_VALUE) en Java ) La
solución podría ser usar un largo o algo pero, estilísticamente, no lo sé como ese enfoque
Ahora, el concepto de un número palindrómico es que el número debe leer el mismo hacia adelante y hacia atrás. Excelente. Con esta información, podemos comparar el primer dígito y el último dígito. El truco es que, para el primer dígito, necesitamos el orden del número. Digamos, 12321. Dividir esto entre 10000 nos daría el primer 1. El 1 posterior se puede recuperar tomando el mod con 10. Ahora, para reducir esto a 232
(12321 % 10000)/10 = (2321)/10 = 232
.. Y ahora, el 10000 necesitaría ser reducido por un factor de 2. Entonces, ahora al código Java ...Editado según la sugerencia de Hardik para cubrir los casos donde hay ceros en el número.
fuente
En Python, hay una forma rápida e iterativa.
Esto también evita problemas de memoria con recursividad (como el error StackOverflow en Java)
fuente
La forma más rápida que sé:
fuente
Solo por diversión, este también funciona.
fuente
¿Por qué descartar esa solución? Es fácil de implementar y legible . Si le preguntaron sin computadora a mano si
2**10-23
es un palíndromo decimal, seguramente lo probaría escribiéndolo en decimal.Al menos en Python, el eslogan 'las operaciones de cadena son más lentas que la aritmética' es realmente falso. Comparé el algoritmo aritmético de Smink con una simple inversión de cadena
int(str(i)[::-1])
. No hubo diferencias significativas en la velocidad: sucedió que la inversión de la cuerda fue marginalmente más rápida.En lenguajes compilados (C / C ++), el eslogan puede mantenerse, pero uno corre el riesgo de errores de desbordamiento con grandes números.
Resultados en segundos (menos es mejor):
fuente
Respondí el problema de Euler de una manera muy brutal. Naturalmente, había un algoritmo mucho más inteligente en la pantalla cuando llegué al nuevo hilo del foro asociado desbloqueado. A saber, un miembro que se hizo cargo de Begoner tenía un enfoque tan novedoso que decidí volver a implementar mi solución usando su algoritmo. Su versión estaba en Python (usando bucles anidados) y la volví a implementar en Clojure (usando un solo bucle / recur).
Aquí para tu diversión:
También hubo respuestas de Common Lisp, pero fueron indescifrables para mí.
fuente
Aquí hay una versión de Scheme que construye una función que funcionará contra cualquier base. Tiene una verificación de redundancia: devuelve falso rápidamente si el número es un múltiplo de la base (termina en 0).
Y no reconstruye todo el número invertido, solo la mitad.
Eso es todo lo que necesitamos.
fuente
Solución recursiva en rubí, sin convertir el número a cadena.
fuente
Versión de Golang:
fuente
Saque el primer y último dígito y compárelos hasta que se agote. Puede haber un dígito a la izquierda, o no, pero de cualquier manera, si todos los dígitos aparecidos coinciden, es un palíndromo.
fuente
Aquí hay una solución más en c ++ usando plantillas. Esta solución funcionará para la comparación de cadenas de palíndromo insensible a mayúsculas y minúsculas.
fuente
Un método con un factor constante un poco mejor que el método @sminks:
fuente
Aquí hay una versión #
fuente
Un número es palindrómico si su representación de cadena es palindrómica:
fuente
fuente
Para verificar el número dado es Palindrome o no (Código Java)
fuente
Muchas de las soluciones publicadas aquí invierten el número entero y lo almacenan en una variable que usa espacio adicional
O(n)
, pero aquí hay una solución conO(1)
espacio.fuente
Siempre uso esta solución de Python debido a su tamaño compacto.
fuente
Prueba esto:
fuente
Aquí hay una solución que usa listas como pilas en python:
hacer estallar la pila solo considera el lado derecho del número para la comparación y falla rápidamente para reducir los cheques
fuente
fuente
fuente
fuente
La forma recursiva, no muy eficiente, solo proporciona una opción
(Código de Python)
fuente