2017-06-25 2 views
-2

Also habe ich hier eine Funktionsantwort erstellt und was ich genau machen möchte, ist die Anzahl zu drucken, bis die Liste eindeutige Werte hat.Ich möchte die Länge der Liste auf das erste Duplikat drucken?

Was ich getan habe ist:
Schritt 1: Ich habe eine Nummer x in eine Funktion übergeben.
Schritt 2: Erstellt x und y, die nichts als aufsteigende und absteigende Werte von x ist.
Schritt 3: Ich habe z = x-y und z bis n zugewiesen, was der neue Wert von n ist Schritt 4: Wiederholen und Werte in einer Liste speichern, bis die Liste eindeutig ist.

Zum Beispiel: wenn n = 1211, dann x = 2111 und y = 1112 daher z = 2111-1112 = 0999 jetzt nächste n = 0999.

  1. Jetzt Liste ist [1211, 0999]
  2. Dies wird weitergehen, bis die Liste eindeutigen Wert hat

Ich weiß, dass etwas mit meiner Antwort-Funktion falsch ist, weil, was es gerade tut, ist Entfernen Sie doppelte Werte aus der Liste und drucken Sie sie. Jetzt läuft es eine Endlosschleife, aber sollte nicht, weil die Antwort 1 ist, wiederholt es nach einem Wert. Können Sie mir sagen, wie ich meinen Code verbessern kann, damit ich die Anzahl richtig berechnen kann?

+2

Ich verstehe nicht genau, was Sie wollen? Möchten Sie die Anzahl der eindeutigen Elemente oder der Duplikate oder die Länge der Liste auf das erste Duplikat oder die Länge der Liste aus dem letzten Duplikat zählen? Bitte umschreiben, um es klarer zu machen. – JohanL

+0

Länge der Liste bis zum ersten Duplikat. @JohanL –

+0

Wie funktioniert 'n nicht in Zahlen [: n]:' genau? Sie möchten die Liste vom Anfang bis zum 1211-Index einer leeren Startliste aufteilen? –

Antwort

0

Es gibt zwei (Haupt-) Probleme mit Ihrem Code. Zuerst müssen Sie die vollständige Liste der Nomen überprüfen, um sicherzustellen, dass Sie keine Duplikate haben, nicht eine Scheibe bis n, wobei n eine ziemlich willkürliche Zahl ist. Darüber hinaus müssen Sie Ihre Listeneinträge auch als Zeichenfolgen aufbewahren, um sicherzustellen, dass Sie '0999' als solche und nicht als 999 darstellen. Mit dieser Änderung ascend und descend muss die Eingabe nicht in Zeichenfolgen umgewandelt werden, stattdessen muss das Ergebnis in eine Zeichenfolge mit führenden Nullen konvertiert werden.

Wenn Sie die Zykluslänge des sich wiederholenden Musters finden möchten, müssen Sie am Ende ein paar Zeilen hinzufügen, wo Sie das gefundene Duplikat als Suchwert in Ihre ursprüngliche Liste verwenden, um das erste Element zu finden des Zyklus.

So mit diesen Änderungen der Code aussehen, wo der endgültige Druck aus dem Zyklus ist:

def descend(n): 
    listb = map(int, n) 
    b = sorted(listb, key=int, reverse=False) 
    asc = int(''.join(map(str, b))) 
    return asc 

def ascend(n): 
    lista = map(int, n) 
    a = sorted(lista, key=int, reverse=True) 
    dsc = int(''.join(map(str, a))) 
    return dsc 

def answer(n): 
    n_len = len(n) 
    nums = [] 
    while n not in nums: 
     final = nums.append(n) 
     w = len(nums) 
     x = ascend(n) 
     y = descend(n) 
     z = x - y 
     n = "{:0{n_len}}".format(z, n_len=n_len) 
     print w 
     print nums 
    first = nums.index(n) 
    nums = nums[first:] 
    w = len(nums) 
    print w 
    print nums 

answer("1211") 

Ich hoffe, das ist die Antwort, die Sie suchen.

+0

Dies ist genau das, was ich suchte, außer für ihre ist ein kleines Problem, wenn Sie das ansprechen könnte, wenn ich Ihnen dankbar wäre. An einem bestimmten Punkt n = 6174 und dann z = 7641 - 1467, was nichts anderes als 6714 ist und nach diesem Punkt rekursiv ist. So ist ihre Art und Weise kann ich diesen Zyklus zählen und die Zählung, die 1 in diesem Fall ist –

+0

Nun, das funktioniert einfach, nicht wahr? Wenn ich 'answer' ('6174') teste, erhalte ich die Ausdrucke '1' und' ['6174'] '. – JohanL

+0

Ich möchte das tun, weil dieser Zyklus für diese bestimmte Zahl klein ist, d.h. 6714 kommt in nur einer Iteration zu 6714, also hat die Liste (6714). Aber in einigen Fällen kann dieser Zyklus groß sein.So ist ihr jeder Weg, ich könnte diesen Zyklus finden –

Verwandte Themen