LeetCode Python3——6. Z字形變換

問題描述

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串爲 “LEETCODEISHIRING” 行數爲 3 時,排列如下:
L     C     I    R
E T  O E  S I  I  G
E     D    H   N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:“LCIRETOESIIGEDHN”。。

示例 1:

輸入: s = “LEETCODEISHIRING”, numRows = 3
輸出: “LCIRETOESIIGEDHN”

示例 2:
輸入: s = “LEETCODEISHIRING”, numRows = 4
輸出: “LDREOEIIECIHNTSG”
解釋:
L     D    R
E  O E  I  I
E C   I H  N
T     S    G

Sol 1: (等差數列)

class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        tr=""
        if numRows==1: return s
        for i in range(numRows):
            j=i       
            if i==0 or i==numRows-1:
                 while(j<len(s)):
                        tr=tr+s[j]
                        j=j+2*numRows-2
            else:
                 while(j<len(s)):
                    tr=tr+s[j]
                    j=j+2*numRows-2-2*i
                    if(j<len(s)):
                        tr=tr+s[j]
                    j=j+2*i
        return tr

從上式的三排和四排的情況,可以找出第一行和最後一行的規律是
j=j+2numRows2j=j+2*numRows-2jj代表的是下一個詞的位置。同理,除首末行之外的行的規律是j=j+2numRows22ij=j+2*numRows-2-2i,以及j=j+2ij=j+2i(沒錯,會多插一個位置,可以根據畫圖知道)。

運行時間:216ms 內存佔用:6.6M

Sol 2: (壓縮矩陣)

class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if numRows == 1:
            return s
        zigzag = ['' for i in range(numRows)]  # 初始化zigzag爲['','','']
        row = 0                                # 當前的行數
        step = 1                               # 步數:控制數據的輸入
        for c in s:
            if row == 0:
                step = 1
            if row == numRows - 1:
                step = -1
            zigzag[row] += c
            row += step
        return ''.join(zigzag)

這個方法如下表所示:

參考https://www.cnblogs.com/mzct123/p/5914383.html

1 7
2 6 8 12
3 5 9 11
4 10

壓縮後:

1 7
2 6 8 12
3 5 9 11
4 10

這樣一來就可以通過調整step來根據加入每個詞。

運行時間:92ms 內存佔用:6.6M

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章