每日刷題 Z 字形變換

2021-09-26 14:31:53 字數 1663 閱讀 5191

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

比如輸入字串為 「leetcodeishiring」 行數為 3 時,排列如下:

l   c   i   r

e t o e s i i g

e d h n

之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如:「lciretoesiigedhn」。

再比如輸入字串為 「leetcodeishiring」 行數為 4 時,排列如下:

l     d     r

e o e i i

e c i h n

t s g

請你實現這個將字串進行指定行數變換的函式:string convert(string s, int numrows);

這個問題並不複雜。

方法一:按行排序

首先給出乙個較為直觀的演算法,利用輔助空間(二維陣列),使用向上/向下標記來選定方向,構造 z 字形字串。

**:

class

solution

// 以下情況適合於 numrows >= 3 時,此時存在乙個 z 型

//為了方便,建立足夠大的輔助空間

vector< vector<

char

>>

record

( numrows, vector<

char

>

( s.

size()

));int down =

1, count =0;

int temp = numrows;

for(

int i =

0; i < s.

size()

; i++)if

( down)

else

string res;

for(

int i =

0; i < numrows; i++

)for

(int j =

0; j < s.

size()

; j++)if

( record[i]

[j])

res +

= record[i]

[j];

return res;}}

;//時間複雜度為o( numrows * s.size())

// 可以通過優化空間,將演算法執行時間優化到到 o(n)

方法二:按行訪問。(依據下標的規律)

首先讀取第 0 行的字元,之後讀取第 1 行, 第 2 行,…,第 numrows - 1 行的字元。

對於所有的整數 k:

第 0 行的字元位於索引 k( 2 * numrows - 2) 處;

第 numrows - 1 行中的字元位於索引 k * (2 * numrows - 2) + numrows - 1 處;

內部第 i 行的字元位於索引 k(2numrows - 2) + i 和 (k+1)( 2numrows) - i處。

class

solution

}return res;}}

;// 改演算法執行時間為o(n)

leecode刷題 Z 字形變換

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

每日演算法 Z字形變換

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

Z字形變換

題目 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 思路 通過從左向右迭代字串,我們可以輕鬆地確定字元位於 z 字形圖案中的哪一行。演算法 我們可以使用 min num...