题目
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 s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4 Output: "PINALSIGYAHRPI" Explanation: P I N A L S I G Y A H R P I
解法
来源于官方C++的solution
基本思路:
使用goingDown作为标识,以表征此时需要执行ZigZag的上或下,到达ZigZag的顶部或底部时,goingDown翻转。
需要注意点:
- 输入字符串的长度值 可能会比numRows小,此时,真实的ZigZag行数 等于 字符串的长度;
- Python中,对于bool量,条件“或”可以使用"or"、"|" 两种符号,但是要注意运算符的优先级问题,例如:
- curRow += 1 if goingDown else -1 类似于C++的三目运算符 curRow += goingDown ?1: -1
class Solution:
def convert(self, s: str, numRows: int) -> str:
if (numRows == 1):
return s
rows = ['']*min([numRows,len(s)])
curRow = 0
goingDown = False
for c in s:
rows[curRow] += c
if (curRow == 0 or curRow == numRows - 1):
goingDown = not goingDown
curRow += 1 if goingDown else -1
res = ''
for row in rows:
res += row
return res