将字符串转化成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
相关文章
相关标签/搜索