圖解leetcode5-10 | 和233醬一起刷leetcode系列(2)
阿新 • • 發佈:2020-06-23
![](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;
}