將乙個給定字串根據給定的行數,以從上往下、從左到右進行 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...