Leetcode - 6 Z字変換パイソン

免責事項:この記事は、オリジナルである、すべての権利予約https://blog.csdn.net/weixin_41864878/article/details/90478410

所与の行に従って指定した文字列の数は、ダウンに、Z字状の配置から左。

例えば、入力文字列が行の数である「LEETCODEISHIRING」次のように配置し、3:

LCIR
ETOESIIG
EDHNは
「LCIRETOESIIGEDHN」:行右に読み取りラインに左からその後は、次のような、新しい文字列を生成し、出力を必要としています。

あなたは、この行の文字列変換関数指定された数を実現します。

文字列変換(numRowsの数INT文字列s、 );
例1:

入力:S = "LEETCODEISHIRING"、numRowsの数 = 3
出力: "LCIRETOESIIGEDHN"
例2:

入力:S = "LEETCODEISHIRING"、numRowsの数は = 4
出力: "LDREOEIIECIHNTSG"
説明:

LDR
EOEII
ECIHN
TSG

リストルックアップテーブル

爆発として、numRowsの数でZ字型の法律を、まず見つけます
ここに画像を挿入説明

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if not s or len(s) <= 2: return s
        if numRows == 1:return s 
        #s = s.split('"')[0]
        length = 2 * (numRows - 1)
        k = len(s) // length
        n = len(s) % length #余数部分的讨论
        i = -1
        out = [None] * k if n == 0 else [None] * (k+1) #多余的一行记录不能完整构成一个单位的部分
        #构造out列表
        for i in range(k):
            out[i] = s[length*i: length*(i+1)]
        if n: out[k] = s[length * (i+1):len(s)]
        
        res = ''.join([out[j][0] for j in range(len(out))]) #先读第一行,就是out中每一列的第一个字母
        for i in range(1, numRows-1):
            if n != 0:
                res += ''.join([out[j][i] + out[j][length - i] for j in range(len(out)-1)]) #再按索引依次读,中心线就是index=numRows
                if n > length-i: res += out[len(out) - 1][i] + out[len(out) - 1][length-i]
                elif n > i: res += out[len(out) - 1][i]
            elif n == 0: res += ''.join([out[j][i] + out[j][length - i] for j in range(len(out))])
            
        res += ''.join([out[j][numRows-1] for j in range(len(out)-1)])# 读最下面一行,每行只有一个字母
        if n > numRows-1: res += out[len(out) - 1][numRows-1]
        elif n == 0: res += out[len(out)-1][numRows-1]
        return res

もともと私はこの愚かな愚かなアルゴリズムはHHHHた後、実際にタイムアウトエラーの結果であると考え
ここに画像を挿入説明

おすすめ

転載: blog.csdn.net/weixin_41864878/article/details/90478410