問題描述
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 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
從上式的三排和四排的情況,可以找出第一行和最後一行的規律是
,代表的是下一個詞的位置。同理,除首末行之外的行的規律是,以及(沒錯,會多插一個位置,可以根據畫圖知道)。
運行時間: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