Como verifico se um número é um palíndromo?
Qualquer língua. Qualquer algoritmo. (exceto o algoritmo de transformar o número em uma sequência e depois reverter a sequência).
algorithm
language-agnostic
Esteban Araya
fonte
fonte
number
eis a palindrome
significa neste contexto: como sobre 13E31 (dez base)? 01210 (zero inicial)? + 10-10 + 1 (ternário balanceado de cinco dígitos)?Respostas:
Este é um dos problemas do Project Euler . Quando o resolvi em Haskell, fiz exatamente o que você sugere, converte o número em uma String. É então trivial verificar se a string é um palíndromo. Se o desempenho é bom o suficiente, por que se preocupar em torná-lo mais complexo? Ser um pallindrome é uma propriedade lexical e não matemática.
fonte
to describe an algorithm to convert an integer to a string, which of course requires you to understand modulo
- não. Computar no sistema de números de destino, poder adicionar serve (pense em como você costuma converter de decimal para binário - ser usado para pensar que computação significa binário não significa que você não pode fazer, por exemplo, aritmética decimal (e você pode fazer conversão de binário para decimal sem divisão ou módulo 2) #Para qualquer número:
Se
n == rev
entãonum
é um palíndromo:fonte
num
divisão posterior (digitação mais solta), você precisará fazer issonum = floor(num / 10)
.Funciona apenas para números inteiros. Não está claro a partir da declaração do problema se números de ponto flutuante ou zeros à esquerda precisam ser considerados.
fonte
Acima da maioria das respostas que têm um problema trivial está a possibilidade de a variável int transbordar.
Consulte http://articles.leetcode.com/palindrome-number/
fonte
fonte
Empurre cada dígito individual em uma pilha e depois solte-os. Se for o mesmo para a frente e para trás, é um palíndromo.
fonte
Não notei nenhuma resposta que resolvesse esse problema sem espaço extra, ou seja, todas as soluções que vi usavam uma string ou outro número inteiro para reverter o número ou algumas outras estruturas de dados.
Embora linguagens como Java envolvam o estouro de números inteiros, esse comportamento é indefinido em linguagens como C. ( Tente reverter 2147483647 (Integer.MAX_VALUE) em Java ) A
solução alternativa poderia ser usar um longo ou algo parecido, mas, estilisticamente, não o faço. como essa abordagem.
Agora, o conceito de um número palindrômico é que o número deve ler o mesmo para a frente e para trás. Ótimo. Usando essas informações, podemos comparar o primeiro e o último dígito. Truque é que, para o primeiro dígito, precisamos da ordem do número. Digamos, 12321. Dividir isso por 10000 nos daria o primeiro. O 1 final pode ser recuperado usando o mod com 10. Agora, reduza-o para 232
(12321 % 10000)/10 = (2321)/10 = 232
.. E agora, o 10000 precisaria ser reduzido por um fator de 2. Então, agora vamos para o código Java ...Editado conforme a sugestão de Hardik para cobrir os casos em que há zeros no número.
fonte
No Python, existe uma maneira rápida e iterativa.
Isso também evita problemas de memória com recursão (como erro StackOverflow em Java)
fonte
Maneira mais rápida que eu conheço:
fonte
Apenas por diversão, este também funciona.
fonte
Por que descartar essa solução? É fácil de implementar e legível . Se você foi perguntado com nenhum computador na mão se
2**10-23
é um palíndromo decimal, você certamente o testaria escrevendo-o em decimal.Pelo menos em Python, o slogan 'operações com strings são mais lentas que aritméticas' é realmente falso. Comparei o algoritmo aritmético de Smink com a simples reversão de string
int(str(i)[::-1])
. Não houve diferença significativa na velocidade - aconteceu que a reversão das cordas foi marginalmente mais rápida.Em linguagens compiladas (C / C ++), o slogan pode se manter, mas corre-se o risco de erros de transbordamento com grandes números.
Resultados em segundos (quanto menor, melhor):
fonte
Eu respondi ao problema de Euler usando uma maneira muito bruta-forçada. Naturalmente, havia um algoritmo muito mais inteligente em exibição quando cheguei ao novo segmento de fórum associado desbloqueado. Nomeadamente, um membro que passou pela alça Begoner tinha uma abordagem tão nova que decidi reimplementar minha solução usando seu algoritmo. Sua versão estava em Python (usando loops aninhados) e eu a reimplementei no Clojure (usando um único loop / recorrência).
Aqui para sua diversão:
Havia respostas do Common Lisp também, mas elas eram imperdoáveis para mim.
fonte
Aqui está uma versão do esquema que constrói uma função que funcionará em qualquer base. Possui uma verificação de redundância: retorne falso rapidamente se o número for múltiplo da base (termina em 0).
E não reconstrói todo o número invertido, apenas metade.
É tudo o que precisamos.
fonte
Solução recursiva em ruby, sem converter o número em string.
fonte
Versão Golang:
fonte
Retire o primeiro e o último dígito e compare-os até acabar. Pode haver um dígito restante, ou não, mas, de qualquer forma, se todos os dígitos exibidos coincidirem, é um palíndromo.
fonte
Aqui está mais uma solução em c ++ usando modelos. Esta solução funcionará para comparação de cadeias palíndricas sem distinção entre maiúsculas e minúsculas.
fonte
um método com um fator constante um pouco melhor que o método @sminks:
fonte
aqui está uma versão #:
fonte
Um número é palíndrico se sua representação de sequência for palíndrica:
fonte
fonte
Para verificar se o número fornecido é Palindrome ou não (código Java)
fonte
Muitas das soluções postadas aqui invertem o número inteiro e o armazenam em uma variável que utiliza espaço extra
O(n)
, mas aqui está uma solução comO(1)
espaço.fonte
Eu sempre uso essa solução python devido à sua compacidade.
fonte
Tente o seguinte:
fonte
Aqui está uma solução que utiliza listas como pilhas em python:
estourar a pilha considera apenas o lado mais à direita do número para comparação e falha rapidamente ao reduzir verificações
fonte
fonte
fonte
fonte
Maneira recursiva, não muito eficiente, basta fornecer uma opção
(Código Python)
fonte