2017-11-03 2 views
0
testcases = int(input()) 
for i in range(testcases): 
    n = int(input()) 
    names = [] 
    for a in range(n): 
     names.append(input()) 
    prefix = '' 
    for b in range(len(names[0])): 
     for c in names: 
      if c.startswith(prefix) == True: 
       common = True 
      else: common = False 
     if common == False: 
       break 
     prefix += names[0][b] 
    print(prefix) 

Ich habe eine Liste von Namen und ich muss das gemeinsame Präfix für jeden Namen finden. Mein Programm funktioniert, gibt aber immer einen weiteren Buchstaben zurück, als es sein soll. Warum ist das und wie repariere ich es?Highscore! Von ACM 2017

Antwort

0

Wenn das aktuelle Präfix mit allen eingegebenen Namen übereinstimmt, fügen Sie ein weiteres Zeichen hinzu. Wenn es nicht übereinstimmt, brechen Sie aus der Schleife - aber das Zeichen, das den Fehler verursachte, ist immer noch am Ende von prefix angehängt.

Es gibt verschiedene Wege, dies zu beheben, aber eine Möglichkeit ist, nur das letzte Zeichen zu entfernen, indem Sie diese Anweisung außerhalb der Schleife hinzu:

prefix = prefix[:-1] # python slice notation - remove the last element 

Es gibt einige Stilen Probleme mit Ihrem Code. Diese werden am besten mit CodeReview und nicht mit Stackoverflow behandelt.

ich es auf diese Weise getan hätte (nach Ihrer Eingabe-Anweisungen mit einem hartcodierte Testfall ersetzen):

x = ["Joseph", "Jose", "Josie", "Joselyn"] 

n = 0 
try: 
    while all(a[n] == x[0][n] for a in x[1:]): 
     n += 1 
except IndexError: 
    pass 
print(x[0][:n]) 

Dieses Skript druckt „Jos“.

+0

Wenn ich aus der Schleife ausbricht, führt es immer noch den Code unter der Pause? Weil mein Präfix + = NACH der Pause kommt, also würde ich denken, dass es es nicht laufen lassen würde, wenn es bricht. @paul – jamestheasiangenius

+0

Die letzte Zeit durch die Schleife haben Sie ein Zeichen am Ende von 'Präfix' hinzugefügt. Du verlässt die Schleife erst, nachdem du "Präfix" getestet hast und es fehlgeschlagen ist. So enthält 'Präfix' an diesem Punkt bereits eine Zeichenfolge, die fehlschlägt; Die Zeichenfolge, die erfolgreich war, muss um genau ein Zeichen kürzer sein. Die break-Anweisung verlässt die Schleife so, dass der folgende Code ausgeführt wird. –

+0

Hmm. Gibt es eine Möglichkeit, dies zu beheben, ohne das Präfix [: - 1] zu verwenden? Ich möchte lernen, wie man das wirklich beheben kann und nicht nur eine Problemumgehung hinzufügen. Danke @paul – jamestheasiangenius