[PYTHON] [Leet Code-Lerndatensatz] Zick-Zack-Konvertierung gelöst

Heute habe ich [ZigZag Conversion] gelöst (https://leetcode.com/problems/zigzag-conversion/). Notieren Sie sich, was Sie darin gelernt haben. Ich bin neu in Python und habe gerade Probleme wie LetCode gestartet. Daher würde ich gerne Fehler oder Ratschläge hören.

Problemstellung

Wenn numRows = 3 für die Zeichenfolge s = "PAYPALISHIRING" angegeben ist

result


P A H N
APLSIIG
Y I R

Es wird gezackt wie. Die Ausgabe ist "PAHNAPLSIIGYIR", in der jede Zeile in der Reihenfolge von links angeordnet ist.

Der Code, den ich zuerst geschrieben habe

Politik

Basierend auf der obigen Richtlinie habe ich den folgenden Code geschrieben:

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        #Umgang mit Kantengehäusen
        if(numRows <= 1):
            return s
        
        d = defaultdict(list)
        Inc = True
        key = 0
        # label 0, 1,2,...,numRows,numrows-1,...,1,0,...
        for i in range(len(s)):
            d[key].append(s[i])
            if(key == numRows - 1):
                Inc = False
            elif(key == 0):
                Inc = True
            if(Inc == True):
                key += 1
            else:
                key -= 1
                
        # join d
        ans = ''
        for i in range(numRows):
            ans += ''.join(d[i])
        return ans

Runtime: 64ms Memory: 12.8MB

Stolperpunkt

So speichern Sie Elemente mit demselben Schlüssel

Für s [i] mit dem gleichen Schlüssel,

d[key] = s[i]

Dann wurde der Wert überschrieben. Dies wurde mithilfe der Listenmethode "append ()" behoben, um am Ende ein Element hinzuzufügen. Es gibt viele andere listenbezogene Methoden, die ich möglicherweise in Zukunft verwenden werde, daher werde ich sie in Zukunft untersuchen.

So konvertieren Sie eine Liste in eine Zeichenfolge

Das d unmittelbar nach der for-Schleife ist

{0: [u'P', u'A', u'H', u'N'], 
1: [u'A', u'P', u'L', u'S', u'I', u'I', u'G'], 
2: [u'Y', u'I', u'R']}

Es war so. Ich dachte, es wäre mühsam, mit einer for-Schleife zu verbinden, also habe ich nachgeschlagen und eine Methode join () gefunden, die die Liste in eine Zeichenfolge konvertiert. Zum Beispiel

d[0] = ['P','A','H','N']
'.'.join(d[0]) # => 'P.A.H.N'

so werden. Wenn diesmal nichts in "" eingefügt wird, wird es einfach verbunden. Wenn Sie dann die Zeichenfolge "join" in aufsteigender Reihenfolge von "key" zu "ans" hinzufügen, erhalten Sie die gewünschte "Ausgabe".

Codeverbesserungen

In LeetCode ist "Diskutieren", mit dem Sie den Code sehen können, an den andere gedacht haben, sehr gut. Für dieses Problem habe ich auf [hier] verwiesen (https://leetcode.com/problems/zigzag-conversion/discuss/3404/Python-O(n)-Solution-in-96ms-(99.43)). Der verbesserte Code wird unten gezeigt:

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if(numRows <= 1):
            return s        
        
        d = [""] * numRows
        Inc = True
        key = 0

        for i in range(len(s)):
            d[key] += s[i]
            if(key == numRows - 1):
                Inc = False
            elif(key == 0):
                Inc = True
            if(Inc == True):
                key += 1
            else:
                key -= 1
                
        
        return ''.join(d)

Runtime: 28ms(<= 64ms) Memory:12.7MB(<=12.7MB) Die Ausführungszeit könnte also auf 1/2 oder weniger reduziert werden.

Initialisierung des Listenarrays

Zum Beispiel

L = ['','','']

Beim Erstellen eines Listenarrays wie z

L = [''] * 3

Wenn ja, habe ich gelernt, dass das Gleiche wie oben gemacht werden kann. Diesmal numRows von 0 bis numRows-1 Es ist klar, dass dieses Element notwendig ist, daher ist dies flexibler und expliziter.

Verbesserung der Klassifizierung nach Schlüssel

Wenn ich jetzt darüber nachdenke, habe ich festgestellt, dass es bei demselben "Schlüssel" möglich ist, einen Schritt zu reduzieren, indem man von Anfang an kombiniert und nicht durch "append ()". Auf diese Weise müssen Sie die Zeichenfolgen nicht erneut mit der for-Schleife nach der for-Schleife verbinden, sondern nur mit ''. Join ().

Recommended Posts

[Leet Code-Lerndatensatz] Zick-Zack-Konvertierung gelöst
Lernrekord Nr. 3
Lernrekord Nr. 1
Lernrekord Nr. 2
Lassen Sie Code Day85 von vorne beginnen "6. Zick-Zack-Konvertierung"
Lernrekord 4 (8. Tag)
Lernrekord 9 (13. Tag)
Lernrekord 3 (7. Tag)
Lernrekord 5 (9. Tag)
Lernrekord 6 (10. Tag)
Lernrekord 8 (12. Tag)
Lernrekord 1 (4. Tag)
Lernrekord 7 (11. Tag)
Lernrekord 2 (6. Tag)
Linux-Lernprotokoll ① Planen
Lernrekord 16 (20. Tag)
Lernrekord 22 (26. Tag)