力扣 6 Z 字形變換 中等

2021-10-24 06:20:42 字數 1583 閱讀 4371

描述:

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

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

l c i r

e t o e s i i g

e d h n

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

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

string convert(string s, int numrows);

示例:

示例 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

較優的解決方案:

class solution 

stringbuilder res = new stringbuilder();

return res.tostring();

}}

思路解析:

今天又聰明了一點點....剛開始的思路是你要幾行我就宣告幾個陣列,然後根據規律放到陣列裡,然後從構建好的陣列中讀取資料進行整合,驚不驚喜,意不意外,就是這麼一點腦子都不動....然後發現這個規律好像不大好找,因為是 「z」 字形排列,在 z 的最後一劃有點麻煩,但是我們真的需要將整個字串分成幾行(幾個陣列嗎),其實不然,我們只需要找到這個排列的規律即可,然後根據規律對字串進行重組,所以就對字串中的每個字元進行了編號,以確定他在哪一行,詳情請看下面的示例。

2行

leetcodeidhiring

1212121212121212

3行1232123212321232

4行1234321234321234

5行1234543212345432

通過這個示例可以看到,乙個z字其實是乙個增減增的過程,我們可以進一步轉化,從整體去看的話,將增減增看做轉折點,則可以看到在1和最大行數時進行轉折,轉換為index則為0和 numrows時進行轉折,有了這個思路,就可以進行構造,使用numrows個stringbuilder分別儲存每一行的字串,使用flag來標記上公升(1)和下降(-1)的轉折點(這個用的太妙了,佩服佩服),使用 i來標記每一行,使用flag來對i進行修改,在轉折點的時候對flag進行反轉,最後將所有的stringbuilder進行合併即可。

我的方法是用了map來對整個string的字元進行了分類,key為行號,value為乙個list來儲存該行的字元,最後進行合併。

6 Z 字形變換 力扣

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

leetcode 中等 6 Z 字形變換

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

力扣刷題 6 Z字形變換

原題鏈結 class solution int interval numrows 2 vector strv numrows for size t i 0 i s.length i else for auto i strv cout i ends string resultstr for auto ...