1. 程式人生 > >【leetcode】6 Python實現Z字型變換

【leetcode】6 Python實現Z字型變換

題目描述

將字串 “PAYPALISHIRING” 以Z字形排列成給定的行數:

P   A   H   N
A P L S I I G
Y   I   R

之後從左往右,逐行讀取字元:“PAHNAPLSIIGYIR”

實現一個將字串進行指定行數變換的函式:

string convert(string s, int numRows);

示例 1:

輸入: s = "PAYPALISHIRING", numRows = 3
輸出: "PAHNAPLSIIGYIR"

示例 2:

輸入: s = "PAYPALISHIRING", numRows = 4
輸出: "PINALSIGYAHRPI"
解釋:

P     I    N
A   L S  I G
Y A   H R
P     I

思路

我們考查示例2,從第零列開始,將偶數列和奇數列放在一塊,可以知道,每一塊有b=(4*2-2)個字元 ,(其中4為numRows的值),因為字串中有自己的索引值i,因此對於偶數列的字元,我們可以通過i%b的值來定位到。比如對於第零行中的偶數列的字元,其索引值均滿足i%b== 0, 第一行的偶數列的字元,其索引值均滿足i%b== 1,以此類推,一直到i%b== 4-1,(其中4為numRows的值)。對於奇數列中的字元,我們不這樣定位,因為要保證在偶數列中的字元被定位到時,同行的奇數列也要同時被定位到。因此可以通過偶數列的字元來定位奇數列的字元,例如偶數列字元此時索引值為i,則與它同行的奇數列的索引值則為(i+(numRows-1-i)*2) (可以自己找個例子試下)。

於是,我們可以建立一個空陣列,在滿足i%b==0到numRows-1 時,把字元加進去,其中在第一行到第(numRows-1)行時,把偶數列中的字元加進列表時,同時用上面的方法,把奇數列中的字元也加進去。注意,最後的偶數列和奇數列塊時,用(i+(numRows-1-i)*2)索引時需要判斷一下是否超出給定字串的範圍。

程式碼

class Solution:
    def convert(self, s, numRows):
        n=len(s)
        if numRows==1:
            return s
        else:
            a=
[] b=2*numRows-2 #算出除數 for j in range(n): if j%b==0: a.append(s[j]) for i in range(1,numRows-1): for j in range(n): if j%b==i: a.append(s[j]) if 2*(numRows-i-1)+j<n: a.append(s[2*(numRows-i-1)+j]) for j in range(n): if j%b==(numRows-1): a.append(s[j]) q=''.join(a) #把列表變成字串 return q