Wie überprüfe ich, ob eine Zahl ein Palindrom ist?
Jede Sprache. Beliebiger Algorithmus. (außer dem Algorithmus, die Zahl zu einer Zeichenfolge zu machen und dann die Zeichenfolge umzukehren).
algorithm
language-agnostic
Esteban Araya
quelle
quelle
number
und wasis a palindrome
in diesem Zusammenhang bedeuten soll: Wie wäre es mit 13E31 (Basis zehn)? 01210 (führende Null)? + 10-10 + 1 (fünfstelliges ausgeglichenes ternäres)?Antworten:
Dies ist eines der Probleme von Project Euler . Als ich es in Haskell gelöst habe, habe ich genau das getan, was Sie vorgeschlagen haben, die Zahl in einen String umzuwandeln. Es ist dann trivial zu überprüfen, ob die Saite ein Pallindrom ist. Wenn es gut genug funktioniert, warum sollte man es dann komplexer machen? Ein Pallindrom zu sein ist eher eine lexikalische als eine mathematische Eigenschaft.
quelle
to describe an algorithm to convert an integer to a string, which of course requires you to understand modulo
- nein. Wenn Sie im Zielnummernsystem rechnen, können Sie hinzufügen (denken Sie daran, wie Sie üblicherweise von Dezimal in Binär konvertieren - wenn Sie denken, dass Berechnung Binär bedeutet, bedeutet dies nicht, dass Sie dies nicht können, z. B. Dezimalarithmetik (und Sie können dies tun) Umwandlung von binär zu dezimal ohne Division oder Modulo 2).Für eine bestimmte Anzahl:
Wenn
n == rev
dannnum
ein Palindrom ist:quelle
num
Nachteilung beibehält (lockerere Eingabe), müssen Sie dies tunnum = floor(num / 10)
.Funktioniert nur für Ganzzahlen. Aus der Problemstellung geht nicht hervor, ob Gleitkommazahlen oder führende Nullen berücksichtigt werden müssen.
quelle
Über den meisten Antworten mit einem trivialen Problem steht, dass die Variable int möglicherweise überläuft.
Siehe http://articles.leetcode.com/palindrome-number/
quelle
quelle
Schieben Sie jede einzelne Ziffer auf einen Stapel und entfernen Sie sie. Wenn es vorwärts und rückwärts gleich ist, ist es ein Palindrom.
quelle
Ich habe keine Antworten bemerkt, die dieses Problem ohne zusätzlichen Speicherplatz gelöst haben, dh alle Lösungen, die ich gesehen habe, haben entweder eine Zeichenfolge oder eine andere Ganzzahl verwendet, um die Zahl umzukehren, oder einige andere Datenstrukturen.
Obwohl Sprachen wie Java auf Integer - Überlauf umwickeln, ist dieses Verhalten in Sprachen wie C (undefined Versuchen Umkehren 2147483647 (Integer.MAX_VALUE) in Java )
könnte Abhilfe sein , eine lange oder etwas zu verwenden , aber stilistisch, weiß ich nicht ganz wie dieser Ansatz.
Das Konzept einer palindromischen Zahl ist nun, dass die Zahl vorwärts und rückwärts gleich lauten sollte. Toll. Mit diesen Informationen können wir die erste und die letzte Ziffer vergleichen. Trick ist, für die erste Ziffer brauchen wir die Reihenfolge der Nummer. Sagen wir, 12321. Wenn wir dies durch 10000 teilen, erhalten wir die führende 1. Die nachfolgende 1 kann abgerufen werden, indem der Mod mit 10 genommen wird. Nun, um dies auf 232 zu reduzieren
(12321 % 10000)/10 = (2321)/10 = 232
. Und jetzt müsste der 10000 um den Faktor 2 reduziert werden. Nun zum Java-Code ...Bearbeitet gemäß Hardiks Vorschlag, um die Fälle abzudecken, in denen die Zahl Nullen enthält.
quelle
In Python gibt es einen schnellen, iterativen Weg.
Dies verhindert auch Speicherprobleme bei der Rekursion (wie StackOverflow-Fehler in Java)
quelle
Der schnellste Weg, den ich kenne:
quelle
Nur zum Spaß funktioniert dieser auch.
quelle
Warum diese Lösung ablehnen? Es ist einfach zu implementieren und lesbar . Wenn Sie ohne Computer gefragt würden, ob
2**10-23
es sich um ein Dezimalpalindrom handelt, würden Sie es sicherlich testen, indem Sie es in Dezimalzahl schreiben.Zumindest in Python ist der Slogan "String-Operationen sind langsamer als Arithmetik" tatsächlich falsch. Ich habe den arithmetischen Algorithmus von Smink mit der einfachen Umkehrung von Strings verglichen
int(str(i)[::-1])
. Es gab keinen signifikanten Geschwindigkeitsunterschied - es kam vor, dass die Saitenumkehr geringfügig schneller war.In kompilierten Sprachen (C / C ++) mag der Slogan gelten, aber man riskiert Überlauffehler mit großen Zahlen.
Ergebnisse in Sekunden (niedriger ist besser):
quelle
Ich beantwortete das Euler-Problem mit einer sehr brutalen Art und Weise. Natürlich gab es einen viel intelligenteren Algorithmus, als ich zu dem neuen freigeschalteten zugehörigen Forenthread kam. Ein Mitglied, das sich an Begoner orientierte, hatte einen so neuartigen Ansatz, dass ich mich entschied, meine Lösung mithilfe seines Algorithmus neu zu implementieren. Seine Version war in Python (mit verschachtelten Schleifen) und ich habe sie in Clojure (mit einer einzelnen Schleife / Wiederholung) neu implementiert.
Hier zu Ihrer Unterhaltung:
Es gab auch Common Lisp-Antworten, aber sie waren für mich nicht zu widerlegen.
quelle
Hier ist eine Schema-Version, die eine Funktion erstellt, die für jede Basis funktioniert. Es gibt eine Redundanzprüfung: Geben Sie schnell false zurück, wenn die Zahl ein Vielfaches der Basis ist (endet mit 0).
Und es wird nicht die gesamte umgekehrte Zahl neu erstellt, sondern nur die Hälfte.
Das ist alles was wir brauchen.
quelle
Rekursive Lösung in Ruby, ohne die Zahl in einen String umzuwandeln.
quelle
Golang-Version:
quelle
Entfernen Sie die erste und die letzte Ziffer und vergleichen Sie sie, bis Sie keine mehr haben. Es kann eine Ziffer übrig sein oder nicht, aber so oder so, wenn alle abgesprungenen Ziffern übereinstimmen, ist es ein Palindrom.
quelle
Hier ist eine weitere Lösung in C ++ unter Verwendung von Vorlagen. Diese Lösung funktioniert für den Vergleich von Palindrom-Strings ohne Berücksichtigung der Groß- und Kleinschreibung.
quelle
Eine Methode mit einem etwas besseren konstanten Faktor als die @ sminks-Methode:
quelle
Hier ist eine # Version:
quelle
Eine Zahl ist palindromisch, wenn ihre Zeichenfolgendarstellung palindromisch ist:
quelle
quelle
Die angegebene Nummer zu überprüfen ist Palindrome oder nicht (Java Code)
quelle
Viele der hier veröffentlichten Lösungen kehren die Ganzzahl um und speichern sie in einer Variablen, die zusätzlichen Speicherplatz verwendet.
O(n)
Hier ist jedoch eine Lösung mitO(1)
Speicherplatz.quelle
Ich benutze diese Python-Lösung immer wegen ihrer Kompaktheit.
quelle
Versuche dies:
quelle
Hier ist eine Lösung, die Listen als Stapel in Python verwendet:
Beim Poppen des Stapels wird nur die am weitesten rechts stehende Seite der Zahl zum Vergleich berücksichtigt, und es wird nicht schnell fehlgeschlagen, die Überprüfungen zu reduzieren
quelle
quelle
quelle
quelle
Rekursiver Weg, nicht sehr effizient, bieten nur eine Option
(Python-Code)
quelle