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

[leetcode: Python]6. ZigZag Conversion

2017-05-18 17:33 281 查看
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)

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"
.

方法一:176ms

寻找字母下标与其所在行的对应关系:

编写一个函数convertRowNum(idx, numRows)

输入当前的字符下标idx与行数numRows,返回其所在的行号rowNum

函数如下:

def convertRowNum(self, idx, numRows):
return numRows -1 - abs(numRows - 1 - i % (2 * numRows - 2))


zigzag字符串中字母所在的行号序列为:

1, 2, ... , numRows - 1, numRows, numRows - 1, ... 2, 1


上述序列是一个长度为 2 * numRows - 2 的无限循环

class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows == 1 or numRows >= len(s):
return s
final = [[] for row in xrange(numRows)]
for i in range(len(s)):
final[(numRows - 1 - abs(numRows - 1 - i % (2 * numRows - 2)))].append(s[i])
return ''.join([''.join(final[i]) for i in range(numRows)])


方法二:149ms

class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows<=1:
return s
res = ""
n=len(s)

for i in range(numRows):
for j in range(i,n,2*(numRows-1)):
res += s[j]
if i>0 and i<numRows-1 and j+2*(numRows-1-i)<n:
res +=s[j+2*(numRows-1-i)]

return res


方法三:116ms

class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows <= 1 or len(s) <= numRows:
return s
i, j = 0, 1
ss = [''] * numRows
for v in s:
ss[i] += v
if i == numRows - 1:
j = -1
elif i == 0:
j = 1
i += j
return ''.join(ss)


方法四:92ms

class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows == 1:
return s
i = 0
change = -1
newstr = ['']*numRows
for char in s:
if i == 0 or i==numRows-1:
change = -change
newstr[i] = newstr[i] + char
i = i + change

result = ''.join(newstr)

return result
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: