LeetCode NO 6 Z字形變換

2021-09-10 06:41:22 字數 1624 閱讀 9120

no.6z字形變換

原題:

將字串"paypalishiring"以z字形排列成給定的行數:

p   a   h   n

a p l s i i g

y   i   r

之後從左往右,逐行讀取字元:"pahnaplsiigyir"

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

string convert(string s, int numrows);
示例 1:

輸入:s = "paypalishiring", numrows = 3輸出:"pahnaplsiigyir"
示例 2:

輸入:s = "paypalishiring", numrows = 4輸出:"pinalsigyahrpi"解釋:p     i    n

a   l s  i g

y a   h r

p     i

除了第一行和最後一行沒有中間形成之字型的數字外,其他都有,而首位兩行中相鄰兩個元素的index之差跟行數是相關的,為 2*nrows - 2, 根據這個特點,我們可以按順序找到所有的黑色元素在元字串的位置,將他們按順序加到新字串裡面。對於紅色元素出現的位置也是有規律的,每個紅色元素的位置為 j + 2*nrows-2 - 2*i, 其中,j為前乙個黑色元素的列數,i為當前行數。 比如當n = 4中的那個紅色5,它的位置為 1 + 2*4-2 - 2*1 = 5,為原字串的正確位置。當我們知道所有黑色元素和紅色元素位置的正確演算法,我們就可以一次性的把它們按順序都加到新的字串裡面。

def convert(self, s, numrows):

str_length = len(s)

# 兩列之間的差

node_length = 2 * numrows - 2  

result = ""

if str_length == 0 or numrows == 0

\ or numrows == 1:

return s

# 從第一行遍歷到最後一行

for i in range(numrows):

for j in range(i, str_length, node_length):

# 第一行和最後一行

還有普通行的整列數字

result += s[j]

if i != 0 and i != numrows - 1 and \

j - 2 * i + node_length < str_length:

# 單列行的數字

result += s[j - 2 * i + node_length]

return result

【推薦閱讀】

python物件導向之封裝(04)

從0開始如何用乙個月殺進機器學習比賽top25%

6 Z字形變換

一 題目 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r之後從左往右,逐行讀取字元 pahnaplsiigyir 實現乙個將字串進行指定行數變換的函式 string convert string s,int numrows 示例...

6 Z字形變換

將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 示例1 輸入 s paypalishiring numrows 3 輸出 pahnaplsiigyir 示例 2 輸入 s...

6 Z 字形變換

將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiigedh...