6. Z 字形變換
題目
將一個(gè)給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進(jìn)行 Z 字形排列。比如輸入字符串為 "LEETCODEISHIRING" 行數(shù)為 3 時(shí)案腺,排列如下:L C I R
E T O E S I I G
E D H N
之后,你的輸出需要從左往右逐行讀取康吵,產(chǎn)生出一個(gè)新的字符串劈榨,比如:"LCIRETOESIIGEDHN"。請(qǐng)你實(shí)現(xiàn)這個(gè)將字符串進(jìn)行指定行數(shù)變換的函數(shù):string convert(string s, int numRows);示例 1:輸入: s = "LEETCODEISHIRING", numRows = 3
輸出: "LCIRETOESIIGEDHN"
示例 2:輸入: s = "LEETCODEISHIRING", numRows = 4
輸出: "LDREOEIIECIHNTSG"
解釋:
L D R
E O E I I
E C I H N
T S G
知識(shí)點(diǎn)
- list的sort的使用晦嵌,同時(shí)根據(jù)多個(gè)數(shù)據(jù)排序key=lambda x:(x[3],x[2])
解題
- 在字符串中的位置為s同辣,在二維空間中的位置為(i-橫坐標(biāo),j-縱坐標(biāo))惭载,左上角為(0旱函,0)。對(duì)numRow=4描滔,行走的坐標(biāo)依次為
(0, 0)-(0,1)-(0, 2)-(0, 3)-(1, 2)-(2, 1)-(3, 0)-(3, 1)-(3, 2)-(3, 3)-(4, 2)-(5, 1)-(6, 0)
- 規(guī)律為<u> i不變棒妨,j加至numRow,i+1, j-1, j減至0伴挚,重復(fù)</u>靶衍。這樣就從s到(i,j)做了映射茎芋,dict("L"=(0,0),"E"=(0,1))..
- 讀取的時(shí)候颅眶,直觀想法是是從j=0的開(kāi)始,i一直增加田弥,如果有數(shù)就輸出涛酗。但我覺(jué)得不是去判斷是不是空格,而是把上面的dict的key偷厦,value交換(或者一上來(lái)就直接建立坐標(biāo)到字母的映射)商叹,然后按照key進(jìn)行排序(先排j,j相等的情況下對(duì)i排序)只泼,然后依次輸出
- 簡(jiǎn)化一下剖笙,其實(shí)并不需要一個(gè)map(如果使用map,結(jié)構(gòu)應(yīng)該為dict(i=1,j=2,s='L')请唱,然后放到list里面)弥咪,只需要一個(gè)tuple的list就可以了
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
all_words = []
i = 0
j = 0
ss = 0
if numRow <=1:
return s
while ss < len(s):
while ss < len(s) and j < numRows - 1:
all_words.append((i, j, s[ss]))
j += 1
ss += 1
while ss < len(s) and j > 0:
all_words.append((i, j, s[ss]))
j -= 1
i += 1
ss += 1
all_words.sort(key=lambda x: (x[1], x[0]))
return "".join([w[2] for w in all_words])