1. 程式人生 > >基礎演算法之Z字形變換(Leetcode-6)

基礎演算法之Z字形變換(Leetcode-6)

春招第一步,演算法伴我行

計劃著每天研究幾道演算法題,各個型別儘可能都包含,自己寫出來,好做增強。基本都使用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字形變換之後的結果,然後在通過拼接矩陣中的每一行,就可以得到最後的結果。
關鍵問題是:怎麼得到這個二維矩陣裡面的每個元素?觀察下圖: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

AC
下午去面匯頂,抓住一切可能機會,盡力。