力扣:Z字形变换(python)

题目:

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion

思路:

使用元组存储非空的行、列。使用字典存储字符和对应的行、列。
遍历字符串,利用元组记录每个字符应该存入的行、列值—>(行,列)。并利用字典存储该行、列处应该存储的字符—>{(行,列),‘字符’}。最后遍历字典,将字符连接成字符串输出。

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows < 2:
            return s
        global i
        i = 0
        global column
        column = 0
        row = -1
        global resultMatrix
        resultMatrix = {}
        resultStr = ''
        while i < len(s):  
            while row < numRows-1:
                if i >= len(s):
                    break
                else:
                    row += 1
                    coordinate = (row, column)
                    dict2 = {coordinate: s[i]}  # 临时存储当前字符以及行列值的字典
                    resultMatrix.update(dict2)  # 为结果字典添加新的键值对
                    i += 1
                    del coordinate  # 元组的值不可变,因此每次需要删除元组
            while row > 0:
                if i >= len(s):
                    break
                else:
                    column += 1
                    row -= 1
                    coordinate = (row, column)
                    dict2 = {coordinate: s[i]}
                    resultMatrix.update(dict2)
                    i += 1
                    del coordinate
        k=0
        j=0
        while k < numRows:  # 遍历结果字典,取出字符连接成字符串
            while j < column+1:
                if (k, j) in resultMatrix:
                    resultStr += resultMatrix[(k, j)]
                j += 1
            k += 1
            j=0
        return resultStr

我的方法在内存和时间上都不占优势,看了官方的答案以后,感觉自己写的什么玩意。不过还是记录一下,毕竟也花了时间。官方利用min(numRows,len(s))个列表存储矩阵中的非空位置,其次使用当前行 row 和当前方向 goingDown两个变量指示目前在列表中的位置。也就是说,用了这么多个列表代表行,最后输出的时候把列表首尾相连,拼接起来就行。

你可能感兴趣的:(python,leetcode)