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