題目鏈結
將乙個給定字串根據給定的行數,以從上往下、從左到右進行 z 字形排列。
比如輸入字串為 「leetcodeishiring」 行數為 3 時,排列如下:
l c i r
e t o e s i i g
e d h n
之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如:「lciretoesiigedhn」。
示例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
輸入給出的是一維的順序字串,而輸出的字串是建立在「z字型」這樣乙個二維結構上的。因此可以首先考慮建立乙個二維陣列來儲存這個z字形結構。
由於字串本質上是乙個一維的字元陣列,因此我們建立乙個字串陣列便可以模擬這一二維結構:
string convert
(string s,
int numrows)
//行數比字串長度大的話,實際上只有一列
vector
rows
(min
(numrows,
int(s.
size()
)));
//......
}
「z字型」(或者看起來更像"n字型")遍歷,本質上是先往下,再往上,再往下…因此我們需要判斷好什麼時候調整遍歷的方向。
而只有在兩種情況下需要調整方向:遍歷到第0行(方向需調整至向下),遍歷到最後一行(方向需調整至向上)。
int currow =0;
//當前行
bool goingdown =
false
;//是否向下
for(
char c : s)
currow +
= goingdown ?1:
-1;//根據方向調整行數
}
實際上本題到這裡就幾乎做完了。以示例2為例,表面上我們要儲存的輸出為:
l d r
e o e i i
e c i h n
t s g
實際上儲存的是:
l d r
e o e i i
e c i h n
t s g
按行展開後依然為ldreoeiiecihntsg,因為我們並不關心每行之間的空格。
class
solution
//行數比字串長度大的話,實際上只有一列
vector
rows
(min
(numrows,
int(s.
size()
)));
int currow =0;
//當前行
bool goingdown =
false
;//是否向下
for(
char c : s)
currow +
= goingdown ?1:
-1;//根據方向調整行數
} string res;
for(string row : rows)
return res;}}
;
LeetCode6Z字形轉換
將字串 paypalishiring 以z字形排列成給定的行數 下面這樣的形狀 p a h n a p l s i i g y i r之後按逐行順序依次排列 pahnaplsiigyir 實現乙個將字串進行指定行數的轉換的函式 string convert string text,int nrows...
LeetCode(6) Z字形轉換
本文 題目描述 將字串 paypalishiring 以z字形排列成給定的行數 下面這樣的形狀 p a h n a p l s i i g y i r之後按逐行順序依次排列 pahnaplsiigyir 實現乙個將字串進行指定行數的轉換的函式 string convert string text,i...
leetcode 6 Z字型變換
找規律,將z字型分割,例如 這樣就很容易看出來規律,先建numrows個字串代表每一行的字串 每一次我們只要知道第一行的應當插入的字元下標,自然就能知道下面多行的下標,而第一行前乙個字元和後乙個字元的下標的差值很容易看出來,就是2 x numrows 1 知道了第一行下乙個應當插入的字元下標,反著往...