Schnellster Algorithmus, um zu überprüfen, ob eine Nummer pandigital ist?
Pandigital Zahl ist eine Zahl, die enthält die Ziffern von 1..Anzahl Länge.
Zum Beispiel 123, 4312 und 967412385.
Habe ich gelöst, viele Projekt Euler Probleme, aber die Pandigital Probleme immer über den ein-Minuten-Regel.
Dies ist mein pandigital Funktion:
private boolean isPandigital(int n){
Set<Character> set= new TreeSet<Character>();
String string = n+"";
for (char c:string.toCharArray()){
if (c=='0') return false;
set.add(c);
}
return set.size()==string.length();
}
Ihre eigene Funktion erstellen und testen Sie es mit dieser Methode
int pans=0;
for (int i=123456789;i<=123987654;i++){
if (isPandigital(i)){
pans++;
}
}
Mithilfe dieser Schleife, Sie sollten 720 pandigital zahlen. Meine Durchschnittliche Zeit war 500 Millisekunden.
Ich bin mit Java, aber die Frage ist, offen für jede Sprache.
UPDATE
@andras Antwort hat die beste Zeit bisher, aber @Sani Huttunen Antwort, die mich inspiriert hinzufügen eines neuen Algorithmus, der bekommt fast die gleiche Zeit wie @andras.
std::next_permutation
? InformationsquelleAutor der Frage medopal | 2010-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
C#, 17ms, wenn Sie wirklich wollen, eine überprüfen.
Einer Kontrolle, die im Einklang mit der Wikipedia-definition in der Basis 10:
Auflisten von zahlen in den Bereich, den Sie gegeben haben, generieren von Permutationen, würde genügen.
Der folgenden ist nicht eine Antwort auf Ihre Frage im engeren Sinne, da es nicht einen check implementieren. Es verwendet ein generisches permutation Umsetzung nicht optimiert sind für diesen speziellen Fall - es immer noch erzeugt die erforderliche 720 Permutationen in 13ms (Zeilenumbrüche werden könnte, Durcheinander):
InformationsquelleAutor der Antwort Andras Vass
Dies ist meine Lösung:
Läuft die Schleife in 0,3 Sekunden auf meinem (eher langsames) system.
InformationsquelleAutor der Antwort Michael Borgwardt
Zwei Dinge, die Sie verbessern können:
InformationsquelleAutor der Antwort Mark Byers
Mit einem bit-Vektor, um nachzuverfolgen, welche Ziffern gefunden wurden, scheint der Schnellste raw-Methode. Es gibt zwei Möglichkeiten, es zu verbessern:
Prüfen, ob die Zahl teilbar ist durch 9. Dies ist eine notwendige Bedingung für die pandigital, so können wir ausschließen, 88% der zahlen bis vor.
Verwenden, Multiplikation und Verschiebungen anstelle von Abteilungen, falls dein compiler nicht für dich tun.
Dieser gibt die folgende, läuft die test-benchmark in etwa 3ms auf meinem Rechner. Es erkennt richtig die 362880 9-stellige pan-digital zahlen zwischen 100000000 und 999999999.
InformationsquelleAutor der Antwort Jeffrey Sax
Meine Lösung beinhaltet die Summen und Produkte.
Dies ist in C# und führt in etwa 180ms auf meinem laptop:
InformationsquelleAutor der Antwort Sani Singh Huttunen
InformationsquelleAutor der Antwort Pratik Deoghare
J hat dies sehr schön:
Aber langsam. Werde ich überarbeiten. Für jetzt, Taktung bei 4,8 Sekunden.
EDIT:
Wenn es nur zwischen den beiden zahlen, 123456789 und 123987654, dann dieser Ausdruck:
Läuft in 0.23 Sekunden. Es ist in etwa so schnell, brute-force-Stil, wie es nur geht, in J.
InformationsquelleAutor der Antwort MPelletier
TheMachineCharmer richtig ist. Zumindest für einige der Probleme, es ist besser für die Iteration über alle pandigitals, Prüfung, um zu sehen, ob es passt die Kriterien des Problems. Allerdings denke ich, dass Ihr code nicht ganz richtig ist.
Ich bin mir nicht sicher, was besser ist, SO dass die Etikette in diesem Fall: die Veröffentlichung einer neuen Antwort oder Bearbeitung Ihrer. In jedem Fall, hier ist der geänderte Python-code, die glaube ich richtig zu sein, obwohl es nicht generieren 0-bis-n pandigitals.
InformationsquelleAutor der Antwort MatrixFrog
Könnte man hinzufügen:
Diese kurze Strecke zu einer Menge Ihrer Berechnungen, denn es wird false zurückgegeben, sobald ein Duplikat gefunden wurde, da hinzufügen() gibt false zurück, in diesem Fall.
InformationsquelleAutor der Antwort Reed Copsey
InformationsquelleAutor der Antwort Sameer
Habe ich eine Lösung für die Generierung von Pandigital zahlen mit StringBuffers in Java. Auf meinem laptop, mein code braucht insgesamt 5ms ausgeführt. Dieses nur 1 MS erforderlich ist für die Generierung der Permutationen mit StringBuffers; die übrigen 4ms sind erforderlich für die Umwandlung dieser StringBuffer ein int[].
@medopal: Können Sie in der Zeit, wo dieser code wird auf Ihrem system?
Dieser code kann auch verwendet werden zum erzeugen alle Pandigital zahlen(ohne null). Ändern Sie einfach die Objekt-Erstellung Aufruf
Dies bedeutet, dass es kein Präfix, und die Permutationen muss von "1" und fahren Fort, bis die Länge der zahlen ist 9.
Folgenden werden die Messungen der Zeit für verschiedene Längen.
@andras: Können Sie versuchen, und führen Sie Ihren code zu generieren, der neun Ziffern Pandigital zahlen? Welche Zeit dauert es?
InformationsquelleAutor der Antwort athena
In diesem c# - Implementierung ist etwa 8% schneller ist als @andras über den Bereich 123456789 zu 123987654 aber es ist wirklich schwer zu sehen, auf meiner test-box, als seine Läufe in 14ms und dieser läuft in 13ms.
Wenn wir den Durchschnitt der Ergebnisse von 100 läuft, können wir einen dezimal-Punkt.
@andras Umsetzung Durchschnitte 14.4 ms und die Umsetzung dieser Mittelwerte 13.2 ms
BEARBEITEN:
Es scheint, dass mod (%) ist sehr teuer in c#. Wenn wir ersetzen die Verwendung des mod-operators mit einer hand coded-version, dann diese Umsetzung Durchschnitte 11ms über 100 läuft.
EDIT: Integrierter n/=10 die Ziffern der Berechnung für eine kleine Verbesserung der Geschwindigkeit.
InformationsquelleAutor der Antwort Handcraftsman
Einfache Umsetzung. Brute-forced und berechnet in etwa 140 ms
InformationsquelleAutor der Antwort smac89
In Java
Können Sie immer einfach ist, erzeugen Sie, und konvertieren der Strings in Ganzzahlen, die ist schneller für größere zahlen
Den code unten funktioniert für die Erprobung der zahlen pandigitality.
Für Ihren test mine lief in etwa ~50ms
1-9 PanDigital
oder mehr, allgemein 1 bis N,
Und just for fun, 0, 9, null, erfordert zusätzliche Logik durch eine führende null
Auch für die Einstellung der iteration Grenzen:
Könnten Sie einfach mit diesem code, der zum generieren eines generischen MtoNPanDigital Anzahl checker
InformationsquelleAutor der Antwort Kenny Cason
Entschied ich mich, etwas zu verwenden, wie diese:
InformationsquelleAutor der Antwort Krolique
Geradlinig
BZW. wenn Sie sicher sind, dass die Zahl der richtigen Länge bereits
InformationsquelleAutor der Antwort Hiten Naresh Vasnani
Ich umgestaltet Andras' Antwort für Swift:
InformationsquelleAutor der Antwort schirrmacher
tollen Antworten, meine 2 Cent
}
InformationsquelleAutor der Antwort Pingili Venkat Ram Reddy