題目:
將一個(gè)給定字符串 s 根據(jù)給定的行數(shù) numRows 椿息,以從上往下、從左到右進(jìn)行 Z 字形排列沈矿。
比如輸入字符串為 "PAYPALISHIRING" 行數(shù)為 3 時(shí)痪欲,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的輸出需要從左往右逐行讀取仓手,產(chǎn)生出一個(gè)新的字符串胖齐,比如:"PAHNAPLSIIGYIR"。
請(qǐng)你實(shí)現(xiàn)這個(gè)將字符串進(jìn)行指定行數(shù)變換的函數(shù):
參考代碼:
def convert(self, s: str, numRows: int) -> str:
if numRows < 2:
return s
res = ["" for _ in range(numRows)]
i =0
flag = -1
for c in s:
res[i] += c
if i == 0 or i == numRows - 1:
flag = -flag
i += flag
return "".join(res)
借鑒:
1嗽冒、索引不一定是單方向遞增或遞減呀伙,可雙方向加或減,借助一個(gè)flag添坊,可使得索引更加靈活区匠,根據(jù)需要遞增或遞減。
2、創(chuàng)建空字符串列表: res = ["" for _ in range(numRows)]
3驰弄、join()的使用:"".join(res)
string convert(string s, int numRows);
本人的漂亮爛代碼:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1:
return s
res = ["" for i in range(numRows)]
i = 0
loop = numRows*2-2
while i < len(s):
mode = i%loop
if 0 <= mode < numRows:
index = mode
res[index] += s[i]
elif numRows <= mode < loop:
index = loop - mode
res[index] += s[i]
i += 1
result = ''
for c in res:
result += c
return result
反思:
1麻汰、每一行為一個(gè)字符串,總共numRows行戚篙,即定義擁有numRows個(gè)字符串的列表五鲫。
2、找規(guī)律:我們把每一個(gè)V字形上的元素個(gè)數(shù)作為一個(gè)循環(huán)岔擂,每一個(gè)循環(huán)都有numRows*2-2個(gè)元素位喂。這樣問(wèn)題就轉(zhuǎn)換成一個(gè)循環(huán)下的numRows個(gè)字符串賦值問(wèn)題。
3乱灵、對(duì)于完整的一列塑崖,直接就是s[0],s[1]~s[numRows1],但是單個(gè)元素的列痛倚,需要再次找規(guī)律规婆,發(fā)現(xiàn)loop減去s的index(取模后的)就是列表中字符串的index。
4蝉稳、最后就是字符串列表中各字符串連接抒蚜,輸出。這里有個(gè)小技巧耘戚,可以直接使用join()函數(shù)嗡髓。
5、join()將序列中的元素以指定的字符連接生成一個(gè)新的字符串收津。str.join(sequence)
比如:
>>> a=['a','bc','def','ghik']
>>> "".join(a)
'abcdefghik'
>>> '-'.join(a)
'a-bc-def-ghik'