基礎演算法之Z字形變換(Leetcode-6)
阿新 • • 發佈:2019-01-09
春招第一步,演算法伴我行
計劃著每天研究幾道演算法題,各個型別儘可能都包含,自己寫出來,好做增強。基本都使用python語言編寫,主要講一下自己的思路,以及AC情況。水平不夠,大家多指正,不吝賜教,十分感謝。
題目描述:
將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。
比如輸入字串為 “LEETCODEISHIRING” 行數為 3 時,排列如下:
L C I R
E T O E S I I G
E D H N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:"LCIRETOESIIGEDHN"
。
請你實現這個將字串進行指定行數變換的函式:
string convert(string s, int numRows);
示例:
s = "LEETCODEISHIRING", numRows = 3 ——> "LCIRETOESIIGEDHN" "
s = "LEETCODEISHIRING", numRows = 4 ——> "LDREOEIIECIHNTSG
思路:
Z字形變換共包含numRows行,使用一個numRows行的二維矩陣來儲存Z字形變換之後的結果,然後在通過拼接矩陣中的每一行,就可以得到最後的結果。
關鍵問題是:怎麼得到這個二維矩陣裡面的每個元素?觀察下圖:
首先需要確定方向direction是下降還是上升,下降過程中direction=1,上升過程中direction=-1,然後對於每一行,行數則可以通過c+direction來確定。需要格外注意的是第一行和最後一行,以此來判斷到底是下降還是上升:if c == 0 and direction = -1: direction = 1
if c >= numRows: direction = -1
(到達最後一行)。然後就依次儲存每個元素在對應的行result[c]。
整個過程只需要尋找改變的方向,在最後一行和第一行進行方向改變,然後再對每個處理的字元找到需要存放的位置。
result = [[] for _ in range(len(numRows))] c = 0 direction = 1 for p in s: result[c].append(p) if c >= numRows: direction = -1 elif c == 0 and direction == -1: direction = 1 else: c+= direction
完整程式碼:
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows==1 or not s:
return s
dp = [[] for _ in range(numRows)]
c = 0
direction = 1
res = ''
for p in s:
dp[c].append(p)
if c>= numRows-1:
direction = -1
elif c==0 and direction == -1:
direction = 1
c += direction
for i in range(len(dp)):
res += ''.join(dp[i])
return res
下午去面匯頂,抓住一切可能機會,盡力。