【Leetcode】ZigZag Conversion

題目描述

題目原文:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this:
(you may want to display this pattern in a fixed font for better legibility)
(我們將輸入的字符串以zigzag圖形表示後,按照一行一行讀取的形式返回輸出的字符串)
P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);(創建該函數,兩個參數是:輸入字符串,行數)
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”()
舉例:
Example1:
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”
P A H N
A P L S I I G
Y I R
(我們調用convert(“PAYPALISGTRING”,3)時,我們將會返回”PAGNAPLSIIGYIR”)

題目分析

思路:
首先,我們需要知道zigzag是怎樣的形狀,那我們就先來舉幾個簡單的例子來對zigzag形狀進行了解。
我們用ABCDEFGHIJKLMNOPQRSTUVWXWZ作爲輸入串,分別以2,3,4,5作爲行數舉例如下:
這裏寫圖片描述
知道了zigzag的通用形式之後,我們可以進行分析了,我們以ABCDEFGHIJKLMNOPQRSTUVWXWZ作爲輸入串,行數爲5進行討論。
我們知道對字符串的操作實質也就是對應每個元素對應下標的操作,我們把下標標出即可發現規律:
這裏寫圖片描述
我們對列出幾個例子就會發下以下規律(設行數爲:numRows,從第0行開始,與列表下標相同):
1、第0行和第numRow - 1行每兩個主列中間沒有插入新的字母,且間隔相同。(該例中,第0行:0 8 16 24,第4行:4 12 20,且間隔爲8)
我們把間隔記做gap,找規律後我們可發現間隔的通用表達式爲:gap = 2 * numRows - 2 。(該例中,gap = 2 * 5 - 2,gap = 8)
2、其他行除主列元素有規律1外,每兩主列中間都插入1個數。我們設i爲行數(0 ≤ i ≤ numRows),可發現zigzag中第i行第一個元素下標同
爲i,除第0行和第numRow - 1 行外,其他行第二個元素下標爲gap - i。之後該行插入的新元素與第二個元素也間隔gap。(以第1行爲例,
主列元素爲:1 9 17 25(間隔爲gap:8),插入的元素爲:7 15 23(插入的第一個元素:gap - i爲8 - 1爲7,且間隔爲gap:8))
3、第0行和第numRow - 1行,我們按相同間隔輸出該列元素即可;在除第0行和第numRow - 1 行外的行,我們按照主列->插入列->主列->插
入列…..的順序,分別控制好間隔輸出元素即可。我們在設置好越界條件後,按照規律1,、2進行循即可。
給出以ABCDEFGHIJKLMNOPQRSTUVWXWZ作爲輸入串,行數爲2,3,4,5情況的輸出結果:
這裏寫圖片描述

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        #若行數爲1,直接輸出即可
        if numRows == 1:
            return s

        #resultlist爲結果的列表形式
        resultlist = []
        gap = 2 * numRows - 2

        #用嵌套循環完成計算
        for i in range(0, numRows):
            temp1 = i
            temp2 = gap - i

            #分兩種情況,情況1:第0行和第numRows行。temp1爲主列的循環
            if temp1 == 0 or temp1 == numRows-1:
                while temp1 < len(s):
                    resultlist.append(s[temp1])
                    temp1 = temp1 + gap

            #情況二:除首尾行外的其他行。temp1爲主列的循環,temp2爲插入元素的循環
            else:
                while temp1 < len(s):
                   resultlist.append(s[temp1])
                   temp1 = temp1 + gap
                   if temp2 < len(s):
                       resultlist.append(s[temp2])
                       temp2 = temp2 + gap

        #resultst爲未最終返回結果字符串結果
        resultstr = ''.join(resultlist)
        return resultstr
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章