2016-11-02 16 views
0

mein Code scheint richtig, aber ich brauche es -1 zurück, wenn keine größere Zahl erzeugt werden:nächst größere Zahl mit gleichen Ziffern

def next_bigger(n): 
    strNum = str(n) 
    length = len(strNum) 
    for i in range(length-2, -1, -1): 
     current = strNum[i] 
     right = strNum[i+1] 
     if current < right: 
      temp = sorted(strNum[i:]) 
      next = temp[temp.index(current) + 1] 
      temp.remove(next) 
      temp = ''.join(temp)  
      return int(strNum[:i] + next + temp) 
     else: 
      return -1 
    return n 

Mein Versuch, dieses Problem zu lösen nicht funktioniert: Hinzufügen der else ist, was ich wahrgenommen habe, die Alternative zu sein, wenn current größer als right ist.

Bitte helfen!

+0

Können Sie Beispiele für Werte, die Sie für eine Eingabe zurückgegeben werden? –

+0

Ein paar Dinge würden hier helfen - Erstens wäre es großartig, einige Kommentare in diesem Code zu bekommen, damit wir versuchen können, ein Gefühl dafür zu bekommen, was diese Lösung versucht zu machen. Zweitens sollten Sie einige Beispiele von 'next_bigger' mit der Ausgabe anzeigen, die generiert wird. Es ist ideal, wenn Sie sowohl Testfälle zeigen, die funktionieren, als auch solche, die nicht funktionieren. – mgilson

+0

Test.assert_equals (next_bigger (12), 21) Test.assert_equals (next_bigger (513), 531) Test.assert_equals (next_bigger (2017), 2071) Test.assert_equals (next_bigger (414), 441) -Test .assert_equals (next_bigger (144), 414) –

Antwort

1

der Fluss des Codes Wie dem auch sei, ist falsch: in der Schleife, Sie haben die folgende Struktur:

 
for A : 
    if B : 
     return 
    else : 
     return 

So wird Ihr Programm immer vor einer zweiten Iteration beenden.

Leider dieses Posting in einer Antwort auf sein, aber ich kann noch nichts sagen.

0

In einigen Fällen ist das Reparieren des Codes viel schwieriger als das erneute Schreiben. Ich bin mir nicht sicher, wie viel Hilfe das für Sie ist, aber versuchen Sie es mit dem folgenden Code.

def next_bigger(n): 
    str_num = str(n) 
    size = len(str_num) 
    for i in range(2, size + 1): 
     sublist = list(str_num[-i:size]) 
     temp = sorted(sublist, reverse=True) 
     if sublist != temp: 
      return int(str_num[:size-i] + ''.join(temp)) 
    return -1 

Was sie tut, ist, dass sie die Nummer auf der Rückseite (beginnend mit 2 Element Scheiben und geht bis zu len) Scheiben und prüft zu sehen, ob die erzeugte Scheibe die größte Anzahl möglich erzeugt, wenn verbunden. Wenn nicht, wird es durch das nächstgrößere ersetzt und gibt es zurück. Lass mich wissen, ob das für dich funktioniert.


Beispiel

n = 4181536841 

sublist = ['4', '1'] 
temp = ['4', '1'] # they are the same so no larger number can be produced just by looking at a slice of length 2. 

#---------iteration 2--------------- 
sublist = ['8', '4', '1'] 
temp = ['8', '4', '1'] # they are again the same so no larger number can be produced just by looking at a slice of length 3. 

#---------iteration 3--------------- 
sublist = ['6', '8', '4', '1'] 
temp = ['8', '6', '4', '1'] # now they are different. So produce a number out of temp (8641) ans stich it to the rest of the number (418153) 
return 4181538641 
+0

+1 für die "Das Reparieren des Codes ist schwieriger als das Neuschreiben". Habe gerade drei Tage bei der Arbeit verbracht, ohne wirklich zu denken, und es war Mist. Verbrachte den Tag, nachdem ich alles von Grund auf neu geschrieben hatte, und es funktionierte, abgesehen davon, dass es sauberer war. –

Verwandte Themen