【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章