2017-11-19 2 views
2

Ich versuche, die längste Länge der Zeichenkette in alphabetischer ReihenfolgeWie kann ich diese Schleife beenden?

s = 'abcv' 
longest = 1 
current = 1 
for i in range (len(s) - 1): 
    if s[i] <= s[i+1]: 
     current += 1 
    else: 
     if current > longest: 
      longest = current 
      current = 0 
    i += 1 
print longest 

Für diese bestimmte Zeichenfolge zu zählen, ‚Current‘ endet an der richtigen Länge bis 4, modifiziert aber nie am längsten.

EDIT: Der folgende Code läuft nun in einen Fehler

s = 'abcv' 
current = 1 
biggest = 0 
for i in range(len(s) - 1): 
    while s[i] <= s[i+1]: 
     current += 1 
     i += 1 
    if current > biggest: 
     biggest = current 
    current = 0 
print biggest 

Es ist meine Logik scheint richtig, aber ich laufe in Fehler für bestimmte Zeichenfolgen. :(

Obwohl Code Quellen im Internet zur Verfügung stehen, die die längste Zeichenfolge zu drucken, kann ich nicht scheinen zu finden, wie die längste Länge drucken.

Antwort

1

break hinter der Schleife (zu sam Vertiefung springen wie die . for Anweisung continue springt der Schleife zu starten und zu tun, die nächste Iteration

Ihre Logik in der else: Anweisung funktioniert nicht - Sie können es eine weniger einrücken müssen


. 210
if s[i] <= s[i+1]: 

prüft „ist tatsächlich char weniger oder gleich dann nächstes Zeichen“ - wenn dies der Fall, dass Sie Ihre internen Zähler zu erhöhen und setzen längste wenn es länger

Sie ist vielleicht mit if s[i] <= s[i+1]: in Schwierigkeiten geraten - Sie tun es bis len(s)-1. "jfjfjf" ist len("jfjfjf") = 6 - Sie würden von 0 bis 5 iterieren - aber die if Zugriffe s[5] und s[6], die mehr als es gibt Elemente gibt.


Ein anderer Ansatz ohne explizite Indizes gehen über und in zwei Verantwortlichkeiten (Liste der alphabetisch Teilkette, sie Längstes bestellen):

# split string into list of substrings that internally are alphabetically ordered (<=) 
def getAlphabeticalSplits(s): 
    result = [] 
    temp = "" 
    for c in s: # just use all characters in s 
     # if temp is empty or the last char in it is less/euqal to current char 
     if temp == "" or temp[-1] <= c: 
      temp += C# append it to the temp substring 
     else: 
      result.append(temp) # else add it to the list of substrings 
      temp = "" # and clear tem 
    # done with all chars, return list of substrings 
    return result 


# return the splitted list as copy after sorting reverse by length 
def SortAlphSplits(sp, rev = True): 
    return sorted(sp, key=lambda x: len(x), reverse=rev) 

splitter = getAlphabeticalSplits("akdsfabcdemfjklmnopqrjdhsgt") 
print(splitter) 
sortedSplitter = SortAlphSplits(splitter) 
print (sortedSplitter) 
print(len(sortedSplitter[0])) 

Ausgang:

['ak', 's', 'abcdem', 'jklmnopqr', 'dhs'] 
['jklmnopqr', 'abcdem', 'dhs', 'ak', 's'] 
9 

Diese man gibt das Array von Splits zurück + sortiert sie nach absteigender Länge. In einer kritischen Umgebung kostet dies mehr Speicher als Sie, da Sie nur einige Zahlen zwischenspeichern, während der andere Ansatz Listen füllt und in eine sortierte Kopie kopiert.

Um Ihre Codes Index Problem zu lösen ändern Sie Ihre Logik leicht: Beginnen Sie bei der zweiten Zeichen und testen, ob die vorherige ist weniger als dies. Auf diese Weise werden Sie jemals diese Zeichen überprüfen Sie mit dem man vor

s = 'abcvabcdefga' 
current = 0 
biggest = 0 
for i in range(1,len(s)): # compares the index[1] with [0] , 2 with 1 etc 
    if s[i] >= s[i-1]: # this char is bigger/equal last char 
     current += 1 
     biggest = max(current,biggest) 
    else: 
     current = 1 

print biggest 
+0

Vielen Dank! Können Sie den Code, den ich oben bearbeitet habe, überprüfen? Gibt es einen einfacheren Weg, die Zählung zu erreichen? Ich bin ziemlich neu und wurde nicht in die Syntax in Ihrer Lösung eingeführt, um die s [i] Fehler – Sam

+0

meine Antwort wieder lesen :) Sie laufen in ein Indexproblem, weil Sie auf den Charakter hinter dem letzten zugreifen. Die Fehlermeldung (die Sie immer zu Ihren Fragen hinzufügen sollten auch bearbeiten: o) sagt Ihnen so viel: 'IndexError: String-Index außerhalb des Bereichs ' –

+0

@Sam geringfügige Änderung an Ihrem Code zur Behebung Indexierungsfehler –

0

Sie haben die else-Anweisung bearbeiten aus. Da den Fall berücksichtigt, wo der Strom gerade am längsten übersteigt, d. H. Von current = 3 and longest =3, wird der Strom 4, indem er sich inkrementiert.Hier, Sie wollen es noch in der if current > longest Aussage gehen

s = 'abcv' 
longest = 1 
current = 1 
for i in range (len(s) - 1): 
    if s[i] <= s[i+1]: 
     current += 1 
    #else: 
    if current > longest: 
     longest = current 
     current = 0 
    i += 1 
longest = current 
print longest 
+0

Das gibt mir falsche Ausgaben Sollte '4' für die Zeichenfolge 'abcv' sein – Sam

+0

'current = 0' sollte' current = 1' sein tomatch die andere indexer Logik –

0

Am Ende der Schleife Strom ist die Länge des letzten Teilzeichens aufsteigend. Zu am längsten zuweisen ist nicht richtig, da die letzte Teilkette in aufsteigender nicht unbedingt die längste ist.

So longest=max(current,longest) statt longest=current nach der Schleife, sollte es für Sie lösen.

Edit:^war für vor der Bearbeitung. Sie müssen nur longest=max(current,longest) nach der for-Schleife hinzufügen, aus dem gleichen Grund (der letzte aufsteigende Teilstring wird nicht berücksichtigt). So etwas wie das:

s = 'abcv' 
longest = 1 
current = 1 
for i in range (len(s) - 1): 
    if s[i] <= s[i+1]: 
     current += 1 
    else: 
     if current > longest: 
      longest = current 
      current = 0 
    i += 1 
longest=max(current,longest) #extra 
print longest 
+0

@PatrickArtner, gab es einen anderen Code Block in der Frage vor der Bearbeitung, und die Antwort wurde mit diesem Code geschrieben. – recurze

+0

thx für die Bearbeitung –

0

Verwenden Sie eine While-Bedingung Schleife, dann können Sie einfach definieren, unter welchen Bedingungen Ihre Schleife fertig ist. Wenn Sie QualityCode für langfristige wollen: While-Schleife ist besser als eine Pause, weil Sie die Schleife Bedingung an einer Stelle sehen. Die einfache Unterbrechung ist oft schlechter zwischen dem Schleifenkörper zu erkennen.

0

Die Schleife endet, wenn nach dem Tabulatorraum kein Code mehr vorhanden ist, also ist Ihre Schleife technisch bereits beendet

Verwandte Themen