Schalten Sie Indizes, erstellen Sie die nächsthöhere Zahl mit den gleichen exakten 9 Ziffern präsentiert

So erhielt ich eine Herausforderung, die folgendes sagt: "Entwerfen Sie ein Programm, das als Eingabe eine 9-stellige Zahl annimmt, in der keine Ziffer zweimal erscheint und als Ausgabe eine Anordnung der gleichen 9 Ziffern erzeugt, die der nächsthöheren Zahl entspricht. Wenn keine solche Zahl existiert , Der Algorithmus sollte dies angeben. So zum Beispiel, wenn die Eingabe 781623954 die Ausgabe wäre 781624359. "

Also kam ich mit dieser Idee auf, um die Indizes zu drehen, also schau den letzten Index mit dem einen vorher vorher zu sehen, was größer ist und vergleichen dann Flip wenn nötig, aber aus irgendeinem Grund mein Code funktioniert nicht. Ich habe nur die Arbeit für die Überprüfung der letzten beiden Ziffern nicht alle Ziffern, also wenn Sie mir helfen können, und überprüfen Sie es für mich und wenn Sie irgendwelche bessere Ideen auf, wie man dieses Problem zu lösen, bitte teilen.

input = raw_input("Enter 9 Digits: ") x = 9 while x>0: x-=1 if input[8] > input[7]: temp = input[8] input[8] == input[7] input[7] == temp print input break 

3 Solutions collect form web for “Schalten Sie Indizes, erstellen Sie die nächsthöhere Zahl mit den gleichen exakten 9 Ziffern präsentiert”

Ich bin nicht davon überzeugt, dass Ihr Ansatz der Spiegsziffern garantiert ist, die nächsthöhere Nummer zu finden (zumindest nicht ohne weitere Kontrollen)

Hier eine einfache Lösung: Einfach die Eingangsnummer erhöhen und prüfen, ob die Bedingungen erfüllt sind oder ob keine Nummer gefunden werden kann.

set() kann verwendet werden, um die Menge der eindeutigen Ziffern in der Nummer zu erhalten.

 input_num = '781623954' next_num = int(input_num) + 1 input_digits = set(input_num) found = False while not found: next_num += 1 next_digits = set(str(next_num)) found = len(next_digits) == 9 and input_digits == next_digits if next_num > 987654321: break if found: print(next_num) else: print("No number was found.") 

Hier ist ein effizienter Ansatz, mit dem Algorithmus des 14. Jahrhunderts indischen Mathematiker Narayana Pandita, die in der Wikipedia-Artikel auf Permutation gefunden werden kann . Dieser alte Algorithmus ist immer noch einer der am schnellsten bekannten Wege, um Permutationen in der Reihenfolge zu erzeugen, und es ist ziemlich robust, da es richtig Permutationen behandelt, die wiederholte Elemente enthalten.

Der untenstehende Code enthält eine einfache test() -Funktion, die alle Permutationen einer geordneten numerischen Zeichenfolge erzeugt.

 #! /usr/bin/env python ''' Find the next permutation in lexicographic order after a given permutation This algorithm, due to Narayana Pandita, is from https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order 1. Find the largest index j such that a[j] < a[j + 1]. If no such index exists, the permutation is the last permutation. 2. Find the largest index k greater than j such that a[j] < a[k]. 3. Swap the value of a[j] with that of a[k]. 4. Reverse the sequence from a[j + 1] up to and including the final element a[n]. Implemented in Python by PM 2Ring 2015.07.28 ''' import sys def next_perm(a): ''' Advance permutation a to the next one in lexicographic order ''' n = len(a) - 1 #1. Find the largest index j such that a[j] < a[j + 1] for j in range(n-1, -1, -1): if a[j] < a[j + 1]: break else: #This must be the last permutation return False #2. Find the largest index k greater than j such that a[j] < a[k] v = a[j] for k in range(n, j, -1): if v < a[k]: break #3. Swap the value of a[j] with that of a[k]. a[j], a[k] = a[k], a[j] #4. Reverse the tail of the sequence a[j+1:] = a[j+1:][::-1] return True def test(n): ''' Print all permutations of an ordered numeric string (1-based) ''' a = [str(i) for i in range(1, n+1)] i = 0 while True: print('%2d: %s' % (i, ''.join(a))) i += 1 if not next_perm(a): break def main(): s = sys.argv[1] if len(sys.argv) > 1 else '781623954' a = list(s) next_perm(a) print('%s -> %s' % (s, ''.join(a))) if __name__ == '__main__': #test(4) main() 
 input[8] == input[7] input[7] == temp 

Du hast wahrscheinlich gemeint:

 input[8] = input[7] input[7] = temp 

Hast du nicht

Welche, wie in den Kommentaren angegeben, würde nicht direkt auf die Saite arbeiten, da sie in Python unveränderlich ist. Also, als ein erster Schritt, könnten Sie eine Liste von Zeichen aus dieser Zeichenfolge:

 input = list(input) 

Und als letzten Schritt bekomme ich einen String aus der geänderten Liste:

 input = ''.join(input) 

BTW, möchten Sie vielleicht von Python Tupel Auspacken profitieren, die Ihnen erlaubt, zwei Variablen zu tauschen, ohne ein drittes einzuführen:

 input[7], input[8] = input[8], input[7] 
  • Looping durch ein Verzeichnis von Dateien in Python
  • Senden von StopIteration auf Schleife von außerhalb des Iterators
  • Pause ist außerhalb der Schleife Python
  • Schleife rückwärts mit Indizes in Python?
  • Unterschiedliche Ausgabe aus dem gleichen Code mit Exponenten in Python
  • Python drucken eine Zeile gleichen Raum
  • Umwandlung für Loops zu Loops in Python
  • Beschleunigung einer numpy Schleife in Python?
  • Dreieck der Zahlen auf Python
  • Faktorisierung einer Zahl in Python
  • Schleife von 1 bis unendlich in Python
  • Python ist die beste Programmiersprache der Welt.