您的位置:首页 > 编程语言 > Python开发

【python】【leetcode】【算法题目6—ZigZag Conversion】

2016-11-26 15:44 483 查看
一、题目描述

题目原文:

 

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

想法不够优化,欢迎大家留言交流~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息