LeetCode:Z字形變換

問題描述:將一個給定字符串根據給定的行數,以從上往下、從左到右進行 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章