Leetcode——6. Z 字形變換

大寫的ZDQ發表於2019-03-02

將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。

比如輸入字串為 “LEETCODEISHIRING” 行數為 3 時,排列如下:

L C I R
E T O E S I I G
E D H N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:“LCIRETOESIIGEDHN”。

請你實現這個將字串進行指定行數變換的函式:

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

思路:

idx從0開始,自增直到numRows-1,此後又一直自減到0,重複執行。

給個例子容易懂一些:s = “abcdefghijklmn”, numRows = 4

a    g    m
b  f h  l n
c e  i k
d    j

從第一行開始往下,走到第四行又往上走,這裡用 step = 1 代表往下走, step = -1 代表往上走

因為只會有一次遍歷,同時把每一行的元素都存下來,所以時間複雜度和空間複雜度都是 O(N)

def convert(s,numRows):
	if numRows == 1 or numRows > len(s):
		return s
	res = [''] * numRows
	idx,step = 0,1
	for c in s:
		res[''] += c
		if idx == 0:	#第一行,一直向下走
			step = 1
		elif idx==numRows - 1:	#到了最後一行,向上走
			step = -1
		idx += step
	return ''.join(res)

相關文章