Comment puis-je vérifier si un nombre est un palindrome?
Comment puis-je vérifier si un nombre est un palindrome?
N'importe quelle langue. N'importe quel algorithme. (à l'exception de l'algorithme de rendre le numéro de chaîne, puis de l'inversion de la chaîne).
- Pouvez-vous trouver la taille de l'entier de bits? si oui, Dire que A est le pas et s est la taille B = A << s/2 vérifiez si Un&B == 2^s-1 - 2^(n/2) + 1
- Quel est le problème avec de "rendre le numéro de chaîne, puis de l'inversion de la chaîne de caractères"?
- Commencer par définir ce qu'est
number
etis a palindrome
signifie dans ce contexte: comment sur 13E31(base dix)? 01210(zéro)? +10-10+1 (les cinq chiffres équilibre ternaire)?
Vous devez vous connecter pour publier un commentaire.
C'est l'un des Projet Euler problèmes. Quand je l'ai résolu en Haskell j'ai fait exactement ce que vous suggérez, convertir le nombre en une Chaîne de caractères. Il est alors trivial de vérifier que la chaîne est un pallindrome. Si elle effectue assez bien, alors pourquoi s'embêter à le rendre plus complexe? Être un pallindrome est une propriété lexicale plutôt que mathématique.
Pour un nombre donné:
Si
n == rev
puisnum
est un palindrome:num
, après la division (looser de la frappe), vous aurez besoin de faire quenum = floor(num / 10)
.rev1
pourrait déborder. Tenir compte de la contributionnum = 2147483647
Travaille pour des nombres entiers. Il n'est pas clair à partir de l'énoncé du problème si les nombres à virgule flottante ou zéros doivent être considérés.
Au-dessus de la plupart des réponses ayant un banal problème est que la variable int pourraient éventuellement débordement.
Reportez-vous à http://articles.leetcode.com/palindrome-number/
Pousser chaque chiffre sur une pile, puis pop off. Si c'est la même avant et en arrière, c'est un palindrome.
Je n'ai pas d'avis toutes les réponses qui ont résolu ce problème en utilisant l'espace disponible, c'est à dire, toutes les solutions que j'ai vu soit utilisé une chaîne, ou un autre nombre entier pour inverser la le nombre, ou d'autres structures de données.
Bien que les langues comme Java enrouler autour de dépassement d'entier, ce comportement n'est pas défini dans les langues, comme C. (Essayer d'inverser 2147483647 (en Entier.MAX_VALUE) en Java)
Solution pourrait être d'utiliser une longue ou quelque chose, mais, du point de vue stylistique, je ne suis pas tout à fait comme ça approche.
Maintenant, le concept d'un nombre palindrome est que le nombre devrait être la même avant et en arrière. Grand. À l'aide de cette information, nous pouvons comparer le premier chiffre et le dernier chiffre. Astuce consiste, pour le premier chiffre, nous avons besoin de l'ordre du nombre. Dire, 12321. En divisant ce chiffre par 10000 ne nous le leader de 1. La fuite 1 peuvent être récupérées en prenant le mod avec 10. Maintenant, pour réduire ce à 232.
(12321 % 10000)/10 = (2321)/10 = 232
. Et maintenant, les 10000 devra être réduite par un facteur de 2. Donc, maintenant, sur le code Java...Édité par Hardiksuggestion pour couvrir les cas où il y a de zéros dans le nombre.
En Python, il est rapide, de façon itérative.
Cela empêche également les problèmes de mémoire avec la récursivité (comme StackOverflow erreur en Java)
Juste pour le plaisir, celui-ci fonctionne également.
Pourquoi rejeter cette solution? Mise en œuvre est simple et lisible. Si vous avez été invité à pas d'ordinateur à portée de main si
2**10-23
est un décimal palindrome, vous aimeriez certainement un test écrit en décimal.En Python au moins, le slogan "les opérations de la chaîne sont plus lents que l'arithmétique" est en fait faux. J'ai comparé Smink de l'arithmétique de l'algorithme à chaîne simple inversion
int(str(i)[::-1])
. Il n'y avait pas de différence significative de la vitesse - c'est arrivé chaîne de renversement a été légèrement plus rapide.Dans les langages compilés (C/C++) le slogan pourrait tenir, mais on risque des erreurs de dépassement avec un grand nombre.
Des résultats en quelques secondes (en bas c'est mieux):
J'ai répondu à la droite d'Euler problème à l'aide d'un très brute forcy façon. Naturellement, il y a un algorithme plus intelligent lors de l'affichage, quand je suis arrivé à la nouvelle déverrouillé associés fil de discussion du forum. À savoir, un membre qui est allé par la poignée Begoner eu une nouvelle approche, que j'ai décidé de ré-écrire ma solution à l'aide de son algorithme. Sa version était en Python (à l'aide de boucles imbriquées) et je ré-implémenté en Clojure (à l'aide d'une seule boucle/se reproduire).
Ici pour votre amusement:
Il y avait Common Lisp réponses, mais ils ont été ungrokable pour moi.
Voici un Schéma de la version qui construit une fonction qui vont à l'encontre de toute la base. Il a un contrôle de redondance: return false rapidement si le nombre est un multiple de la base (qui se termine en 0).
Et il ne faut pas reconstruire l'ensemble de la inversée nombre, seulement la moitié.
C'est tout ce dont nous avons besoin.
Manière la plus rapide que je connaisse:
Golang version:
Solution récursive en ruby, sans la conversion du numéro de chaîne.
Pop off le premier et le dernier, les chiffres et les comparer jusqu'à ce que de vous lancer. Il y a peut être un chiffre à gauche, ou pas, mais de toute façon, si tout le sauté chiffres correspondent, c'est un palindrome.
Voici encore une solution en c++ à l'aide de modèles . Cette solution de travail pour la casse palindrome de comparaison de chaînes de caractères .
une méthode avec un peu meilleur facteur constant que @sminks méthode:
voici un f# version:
Un nombre palindrome si sa représentation sous forme de chaîne est palindrome:
Pour vérifier le nombre donné est Palindrome ou pas (Code Java)
Beaucoup de solutions posté ici renverse l'entier et la stocke dans une variable qui utilise de l'espace supplémentaire, qui est
O(n)
, mais voici une solution avecO(1)
de l'espace.J'utilise toujours cette python solution en raison de sa compacité.
Essayez ceci:
Ici est une solution de l'usage des listes, comme les piles en python :
popping, la pile ne considère que le côté droit de la le nombre à des fins de comparaison et ne parvient pas rapidement à réduire les contrôles
Récursive façon, pas très efficace, il suffit de fournir une option
(Code Python)
il semble que la easest chose serait de trouver la vis vis du nombre et de comparer les deux:
Essayez ceci:
juste de retour d'appel les fonctions
Ici est une façon.
Je suis allé à la régulière approche par la conversion de numéro de chaîne, puis en plus de la conversion de la chaîne de charArray.
Traversée par le biais de charArray et de trouver si le nombre à des postes sont égaux ou non.
Remarque-: Pas d'inversion de la chaîne.
Cela semble trop de travail, mais avez-vous pensé à la possibilité que le inversée nombre pourrait débordement? S'il déborde, le comportement est spécifique à une langue (Pour Java le nombre s'enroule autour de débordement, mais en C/C++ son comportement n'est pas défini). Beurk.
Il s'avère que la comparaison des deux extrémités est plus facile. Tout d'abord, comparer le premier et le dernier chiffre. Si ils ne sont pas les mêmes, il ne doit pas être un palindrome. Si elles sont identiques, couper un chiffre à partir de deux extrémités et continuer jusqu'à ce que vous n'avez pas de chiffres à gauche, qui vous conclure qu'il doit être un palindrome.
Maintenant, obtenir et de couper le dernier chiffre est facile. Cependant, obtenir et de découper le premier chiffre, de façon générale, nécessite une certaine réflexion. La solution ci-dessous prend soin de lui.
div = 10
, juste bouclewhile (10 <= x)
, tiret du premierreturn
et déposer les accolades autour dediv *= 10;
. Assez similaire à au moins user1552891 réponse.Ne sais pas si c'est la meilleure réponse, et je suis nouveau à la programmation. (c'est en java)
Donc pour ce code, la saisie d'un numéro (je ne les nombres aléatoires de la façon dont beaucoup je veux),
il vous permet de convertir, par exemple, l'entrée est 172345 à 157423. Ensuite, il va changer à 117722, alors si même lui faire 117733, s'il est impair, faire de même pour le seul le dernier chiffre. Puis le faire 173371. Il n'est pas spécifiquement trouver un palindrome, mais c'est de trouver le prochain plus haut nombre palindrome.
public class PalindromePrime {
}
Ce code convertit int en String, puis vérifie si la chaîne est pallindrome. L'avantage est qu'il est rapide, l'inconvénient étant qu'il convertit en int en String, ce qui compromet la solution parfaite à la question.
Une seule ligne de code python :
Cochez cette solution en java :
isPalindrome(123454328)
entraîner de dépassement de capacité arithmétique?Simplement obtenir le nombre de chiffres du nombre via des fonctions Mathématiques et de parcourir au moyen de '/' et '%' opérations comme suit. Après x = (x % diviseur) /10, on doit diviser diviseur par 100 depuis que nous avons fait 2 zéro opérations.
Personnellement, je le fais de cette façon, et il n'y a pas de chevauchement; le code s'arrête la vérification de caractères correspondant à l'endroit approprié si la chaîne a un pair ou impair de la longueur. Certains des autres méthodes posté ci-dessus va tenter de match une fois de plus quand il n'est pas nécessaire.
Si nous utilisons longueur/2, il faudra encore travailler, mais il va faire une vérification supplémentaire qu'il n'a pas besoin de le faire. Par exemple, "pop" est à 3 dans la longueur. 3/2 = 1.5, donc il va arrêter de vérifier lorsque i = 2(depuis le 1<1.5 on va vérifier si i = 1, aussi), mais nous avons besoin d'elle pour s'arrêter à 0, pas un seul. Le premier "p" est en position 0, et il vérifie lui-même à l'encontre de longueur-1-0(position actuelle) qui est le dernier "p" en position 2, puis on se retrouve avec le centre de la lettre qui n'a pas besoin de vérifier. Quand nous faisons de longueur/2 nous nous arrêtons à 1, ce qui se passe est une vérification supplémentaire est effectuée avec je sur la position 1(le "o") et la compare à lui-même (longueur-1-i).
https://repl.it/FNVZ/1
C'est mon code Java. Fondamentalement, la comparaison de la première et de la dernière valeur de la chaîne et à côté interne de la valeur de la paire et ainsi de suite.
Ci-dessous est la réponse à swift.
Il lit les nombres de gauche et de droite et de les comparer entre eux s'ils sont de même.
Faire de cette façon, nous ne seront jamais confrontés à un problème de dépassement d'entier (qui peuvent se produire sur l'inversion de numéro de méthode) que nous ne sommes pas en créer un autre nombre.
Suit:
fin de loo return true
Cette solution est très efficace, depuis que je suis à l'aide de StringBuilder ce qui signifie que la Classe StringBuilder est mis en œuvre comme une mutable séquence de caractères. Cela signifie que vous ajoutez de nouvelles Chaînes ou des caractères sur un StringBuilder.
En supposant que les zéros non significatifs sont ignorés. Suite à la mise en oeuvre:
Zut, je suis fou!
http://www.palindromelist.net/palindromes-d/
Étapes de exemple: est-332 un nombre palindrome?
De débordement n'est pas un problème non plus.
Les deux divisions ont été nécessaires, dans le code (C#), ils sont fait avec les multiplications.
Un n-chiffres: ~n/2 divisions!
Il y a 142948 palindromique numéros de < 2^32, leur somme est 137275874705916.
Celui-ci semble être plus rapide.
Presque équilibré binaire de recherche spaghetti arbre.
Déséquilibré à l'envers.