將字符串轉化成ZigZag模式

背景:python

原問題出處:https://leetcode.com/problems/zigzag-conversion/數組

就是將一個字符串按ZigZag格式進行轉換,並返回。例如字符串"ABCDEFGHIJK"spa

轉換後(3行):code

A E I
BDFHJ
C G K

  而後按行打印:AEIBDFHJCGK
leetcode

若是按4行轉換:字符串

A  G
B FH
CE IK
D  J

打印:AGBFHCEIKDJget

思路:string

其實這道題像是找規律題。當轉換爲3行時,咱們能夠以4爲單位(4=(3-1)*2.也就是等於(行數-1)*2),將字符串分割(以ABCDEFGHIJK爲例):io

ABCD     EFGH   IJKclass

那麼通過轉換後打印的第0行,實際上是分割後每個數組的第0個元素:A E I 。對應到原字符串中就是第0個、第4個、第8.

因此規律爲 0,4,8,...4*n..

那麼通過轉換後打印的第2行(最後一行):打印後的每一個元素爲:C G K.實際上是分割後的每一個數組的第二個元素(下標從0可開始) 。對應到原始字符串就是:2 ,2+4,2+4*2,..2+4*n..

從上面能夠看出,第一行和最後一行的規律爲(設行數爲i,從0開始):i+4*n(n=0,1,2...)

其餘行:

仍是上面的例子,第一行輸出爲:B D F H J.每個元素都是分割後的數組中的第1個和第-1個元素。對應到原字符串中爲:

1,4-1,4+1,4*2-1,4*2+1...

所以規律爲(設i爲行數):4*n+i,4*n-i。

代碼:

個人代碼寫的不簡單,並且耗時大概110ms,也沒有下面的這位朋友的代碼耗時少(107ms),因此推薦該朋友的代碼:

源代碼出處:https://leetcode.com/discuss/11948/my-python-solution

class Solution:
    # @return a string
    def convert(self, s, nRows):
        if nRows == 1:            return s
        D = 2*nRows -2
        L = len(s)
        R = ''
        for i in range(0, nRows):
            MD = 2*nRows - 2 - 2*i
            t = i            while t < L:
                R += s[t]                if i != 0 and i!= nRows-1 and t+MD < L:
                    R += s[t+MD]
                t += D        return R
相關文章
相關標籤/搜索