1. 程式人生 > >Z字形變換

Z字形變換

ext row tco extend ret == 好的 main 給定

將字符串 "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

leetcode上的一道題,一開始看到這個題目,很耿直的就直接做了: 很好的對應劉每一個空格。。
def convert(s,num):
    chushu=num*2-2
    base=1+num-2
    if chushu==0:
        return s
    yushu=len(s)%chushu
    if yushu==0:
        lieshu = len(s) / chushu * base
    elif yushu<=num:
        lieshu=len(s)/chushu*base+1
    elif yushu> num:
        lieshu 
= len(s) / chushu * base + yushu-num+1 newdata=[[‘‘ for j in range(num)] for i in range(lieshu)] k=0 for i in range(lieshu): for j in range(num): if k<len(s): if i%(num-1)==0 or (i+j)%(num-1)==0: newdata[i][j]=s[k] k
+=1 # print newdata a=[] for j in range(num): a.extend([i[j] for i in newdata if i[j]!=‘‘]) return ‘‘.join(a) if __name__ == __main__: s=PAYPALISHIRING res= convert(s,4) print res

結果是:

[[P, A, Y, P], [‘‘, ‘‘, A, ‘‘], [‘‘, L, ‘‘, ‘‘], [I, S, H, I], [‘‘, ‘‘, R, ‘‘], [‘‘, I, ‘‘, ‘‘], [N, G, ‘‘, ‘‘]]
PINALSIGYAHRPI

當然對是沒問題的,就是效率比較低。

這道題有個技巧就是不需要管空格,因為他是按行打印的,P I N,無論你中間隔多少,都是這幾個字母,然後再搞清楚他的排列方式,一會向下一會向上的。

技術分享圖片

def convert3(s,num):
    chushu = num * 2 - 2
    base = 1 + num - 2
    if chushu == 0:
        return s
    newdata=[[] for i in range(num)]
    c=0
    direc=1  #方向
    for i in s:
        newdata[c].append(i)
        if c>=num-1:
            direc=-1
        elif direc==-1 and c==0:
            direc=1
        c+=direc
    print newdata
    return ‘‘.join([‘‘.join(i) for i in newdata])
if __name__ == __main__:
    s=PAYPALISHIRING
    res= convert3(s,4)
    print res

結果是:

[[P, I, N], [A, L, S, I, G], [Y, A, H, R], [P, I]]
PINALSIGYAHRPI

Z字形變換