一、题目描述
题目原文:
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"()(我们调用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情况的输出结果:
三、Python代码
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
四、其他
题目链接:https://leetcode.com/problems/zigzag-conversion/
Runtime: 101 ms
想法不够优化,欢迎大家留言交流~