Leetcode 6. 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"
.
思路: 找出string中第i个元素所处的位置,这里假设numRows = 4。
0 6
1 5 7
2 4 8
3 9
我们可以观察到的是每一个block有2*numRows - 2 = 6个元素。 p元素所在的行数就是p if p < numRows, and numRows - 2 - (p- numRows) if p = i % block。本题的OJ有点问题,如果用二维矩阵的话,似乎无法通过。
1 def convert(s, numRows): 2 """ 3 :type s: str 4 :type numRows: int 5 :rtype: str 6 """ 7 if numRows == 1: 8 return s 9 blockSize = 2 * numRows - 2 10 mat = [[] for row in range(numRows)] 11 12 for i, elem in enumerate(s): 13 p = i % blockSize 14 if p < numRows: 15 mat[p].append(elem) 16 else: 17 mat[numRows - 2 - (p - numRows)].append(elem) 18 19 res = [] 20 for i in range(numRows): 21 res += mat[i] 22 res = ''.join(res) 23 24 return res