模擬 字串 leetcode 6 Z字形變換

2021-10-24 22:34:13 字數 2061 閱讀 4939

題目鏈結

將乙個給定字串根據給定的行數,以從上往下、從左到右進行 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 知道了第一行下乙個應當插入的字元下標,反著往...