LeetCode Z 字形變換

Z 字形變換


題目來源:https://leetcode-cn.com/problems/zigzag-conversion/python

題目


將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。segmentfault

好比輸入字符串爲 "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);spa

示例 1:code

輸入: s = "LEETCODEISHIRING", numRows = 3
輸出: "LCIRETOESIIGEDHN"

示例 2:blog

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

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

解題思路


  1. 先判斷給定的行數是否爲 1 行或者大於所給字符串的長度,符合上面的條件,最終轉換後的結果與原字符串相同,直接返回原字符串;
  2. 題目所說起的變換,實際上是遍歷字符串,將字符正序(這裏表示逐行向下)分配給每行,當到達末行時,方向調轉,將字符逆序(這裏表示逐行向上)分配給每行,觸及首行,方向再次改變,以此往復直到遍歷結束;
  3. 先給每行初始化一個空值,遍歷行分配值。觸及首行或者末行時,方向須要改變(具體見代碼)
  4. 最終將全部的元素合併返回。

代碼實現


class Solution:
    def convert(self, s: str, numRows: int) -> str:
        '''將字符串進行 Z 字形排列
        
        Args:
            s: 給定的字符串
            numRows: 按多少行進行 Z 字形排列
        
        Returns:
            返回 Z 字形排列的結果
        '''
        # 給定列數爲 1,或者大於等於字符串長度直接返回
        if numRows == 1 or numRows >= len(s):
            return s
        # 排列時,只有正序到最後一列,或者逆序到第一列時,方向纔會改變
        i, sign = 0, False
        # 先給每行一個初始值
        lst = ['' for _ in range(numRows)]
        # 遍歷字符串,逐行添值
        for ch in s:
            lst[i] += ch
            # 判斷方向是否須要改變
            # 以向下爲正向,向上會逆向
            # 觸及最頂行,最末行都需改變位置
            if i == 0 or i == numRows - 1:
                sign = not sign
            i += 1 if sign else - 1
        # 合併列表返回合併後的字符串
        return ''.join(lst)

實現結果


實現結果


以上就是本篇的主要內容

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索