LeetCode 刷題筆記 - 6. Z 字形變換

難度:

中等swift

描述:

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。 好比輸入字符串爲 "LEETCODEISHIRING" 行數爲 3 時,排列以下:bash

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
複製代碼

來源:力扣(LeetCode) 連接:leetcode-cn.com/problems/zi… 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。函數


語言:

swiftui

解析:

這題我找到了一個規律,拿row = 5來舉例:spa

A       B       C
A     A B     B C     C
A   A   B   B   C   C
A A     B B     C C
A       B       C
複製代碼

對應下標爲:code

0       8         16
1     7 9      15 17     23
2   6   10   14   18   22
3 5     11 13     19 21
4       12        20
複製代碼

我能夠將這個字符串分組,具體分紅幾組,每組有多少個呢?
每組有offset = numRows + numRows - 2 = numRows * 2 - 2個,分紅幾組固然就是groupNumber = count / offset + 1,固然記得要排除numRows == 1的狀況,這個時候offset爲零。找到了對應偏移量和組的數量,咱們就能夠分別對每行的字母進行拼接了。
每行都須要拼接該組第一排的字符,即下標爲groupIndex * offset + row的字符,對於非第一行和最後一行,還要加上Z字形折上去的,對應下標咱們根據row,使用下一個group的開頭去作減法獲得爲(groupIndex + 1) * offset - row。而後依次將字符拼接上就行了,記得判斷是否越界。leetcode

代碼以下:字符串

class Solution {
    func convert(_ s: String, _ numRows: Int) -> String {
        if numRows == 1 {
            return s
        }
        var resultString = ""
        let stringArray = Array(s)
        let offset = numRows * 2 - 2
        let count = stringArray.count
        let groupNumber = count / offset + 1
        for row in 0...numRows - 1 {
            for groupIndex in 0...groupNumber - 1 {
                if (groupIndex * offset  + row) < count {
                    resultString = resultString + String(stringArray[groupIndex * offset  + row])
                }
                if row != 0 && row != numRows - 1 {
                    if (groupIndex + 1) * offset - row < count {
                        resultString = resultString + String(stringArray[(groupIndex + 1) * offset - row])
                    }
                }
            }
        }
        return resultString
    }
}
複製代碼

總結

就是找規律吧,注意邊界條件。get

相關文章
相關標籤/搜索