1. 程式人生 > >圖解leetcode5-10 | 和233醬一起刷leetcode系列(2)

圖解leetcode5-10 | 和233醬一起刷leetcode系列(2)

![](https://upload-images.jianshu.io/upload_images/10998555-bbcea9c9371af3e5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 本週我們繼續來看5道磨人的小妖精,**圖解leetcode6-10~** 多說一句,leetcode10 殺死了233醬不少腦細胞... 另: 沉迷演算法,無法自拔。快來加入我們吧! ![](https://upload-images.jianshu.io/upload_images/10998555-1d83439345ac6b6d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 別忘了233醬的一條龍服務: **公眾號文章題解 -> 私信答疑 -> 刷題群答疑 -> 視訊講解** 我們的目的是成為套路王~ 嘿嘿,廣告完畢 , Let's go! >#### leetcode6: Z 字形變換 **題目描述:** 將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 **題目示例:** ``` 輸入: s = "LEETCODEISHIRING", numRows = 4 輸出: "LDREOEIIECIHNTSG" 解釋: L D R E O E I I E C I H N T S G ``` **解題思路:** 相信小夥伴看到這道題目,也和233一樣覺得Z字形排列的`字串`冥冥中有些`規律`。為了方便解釋 ,我們假設輸入: > 字串s="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" numRows=4 注意: s中的輸入字元依次為:為0-15,中間的空格是我為了展示清楚額外加的。 那麼s的Z字形排列如下: ![](https://upload-images.jianshu.io/upload_images/10998555-67a669792358b468.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 需要輸出的結果是:“0 6 12 15 7 11 13 2 4 8 10 14 3 9 15” 假設我們將Z字形排列後的字串**每一行i 用一個數組arr[i]存起來,最後按行數i的順序輸出arr[i]中的值**,那麼就可以得到最終的輸出結果。 ![](https://upload-images.jianshu.io/upload_images/10998555-09d8c3a2dd9c3660.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 如何知道字串s中的各個字元在哪個arr陣列的哪個索引位置呢?這就是我們用數字字元的字串來舉例子的好處了,因為數字的值就對應著字元在字串s中的下標。當我們遍歷字串s時,是我們可以用`pointer`表示**當前遍歷的字元所對應的行數i**,代表這個字元是要放到arr[i]中的。 ![](https://upload-images.jianshu.io/upload_images/10998555-f20331089be99a52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 我們可以發現每當遍歷numRows=4 個字元,pointer就從 0->3 轉化為 3->0。所以我們可以用一個`flag`記錄pointer的變化量。 思路有了,我們來看一下時間空間複雜度: * 時間複雜度:遍歷一遍字串s: O(n)。 * 空間複雜度:陣列arr的儲存:O(n)。 可以寫出程式碼嗎:) **Java版本** ``` class Solution { public String convert(String s, int numRows) { if(numRows <= 1){ return s; }