https://leetcode.com/problems/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)
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".
Code
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if s is None or len(s) <= numRows or numRows==1:
return s
res = ""
for i in xrange(numRows):
if i == 0 or i == (numRows-1):
res += s[i::(2*numRows-2)]
else:
s1 = s[i::(2*numRows-2)]
s2 = s[(2*numRows-2-i)::(2*numRows-2)]
for c1, c2 in zip(s1, s2):
res += c1 + c2
if len(s1) > len(s2): # s1 is at most longer than s2 by one character
res += s1[-1]
return res
Idea
Every `2*numRows-2` characters in `s` will form one zigzag. You can find the rules when outputing the zigzag horizontally:
