1. 程式人生 > >【LeetCode 中等題】4-Z字形變換

【LeetCode 中等題】4-Z字形變換

宣告:

今天是中等題第4道題。將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:將一個給定字串根據給定的行數,以從上往下、從左到右進行 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"
解釋:
L   C   I   R
E T O E S I I G
E   D   H   N

示例 2:

輸入: s = "LEETCODEISHIRING", numRows = 4
輸出: "LDREOEIIECIHNTSG"
解釋:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

解法1。觀察可以發現一些規律,相鄰兩列之間的差=2*numRows-2,再看看每行的元素下邊index和行數的關係,總結如下:

  • 首尾兩行:只有(lens+numRows-2)/2*(n-2)個元素
  • 中間的下標和行數i及第j位的關係是:j-2*i+k

執行用時: 120 ms, 在ZigZag Conversion的Python3提交中擊敗了82.53% 的使用者

class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        k = 2*numRows - 2
        if not s or numRows == 0 or numRows == 1:
            return s
        lens = len(s)
        res = ''
        for i in range(numRows):
            for j in range(i,lens,k):
                res += s[j]
                if i != 0 and i != numRows and j-2*i+k < lens:
                    res += s[j-2*i+k]
        return res

結尾

解法1:https://blog.csdn.net/chenhua1125/article/details/80412550