問題描述:將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。(輸入字符串s和行數numRows,按新的順序輸出)
例如輸入字符串爲 “LEETCODEISHIRING” 行數爲 3 時,排列如下:
L C I R
E T O E S I I G
E D H N
方法一:找規律
1.模塊化
我們可以從上面例子的形式看出由於這些Z是重疊的,所以我們可以把“一豎”加“一提”看作一個小模塊,比如可以將"LEET"當作第一個小模塊,將“CODE”當作第二個小模塊······
2.確定模塊的大小
先找一個代表性更強的例子:
L D R
E O E I I
E C I H N
T S G
我們可以總結出一個小模塊的“一豎”總比“一提”多2個字符,而“一豎”的字符個數又是行數numRows故可以由此推斷出小模塊的大小爲:
batch_z = 2*numRows-2
3.確定輸出關係
按行輸出的話(以第二個例子爲例)
第0行第0,1,2, 3個元素有0%6=0,6%6=0,12%6=0,18%6=0
第1行第1,1,2, 3個元素有1%6=1,7%6=1,13%6=1,19%6=1
···
可由此推出輸出順序
4.程序
class Solution:
def convert(self, s: str, numRows: int) -> str:
new_s = []
if numRows == 0:
return None
elif numRows == 1:
return s
batch_z = 2*numRows-2 #一條豎邊和一條斜邊構成一個z
vertical_z = int((batch_z+2)/2) # 豎邊的長度
oblique_z = batch_z-vertical_z #斜邊的長度
for j in range(0,vertical_z):
for i in range(0,len(s)):
if i%batch_z == j or i%batch_z == batch_z-j:
new_s.append(s[i])
new_s = ''.join(new_s) # 將列表裏的元素放在一個字符串裏面
return new_s
if __name__ == '__main__':
solution1 = Solution()
s = "12345678"
#s = "abcdefghi"
#s = "a"
print("s=",s)
numRows = 1
new_s = solution1.convert(s,numRows)
print(new_s)