原题说明
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)1
2
3P 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:1
2Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:1
2
3
4
5
6
7Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
解题思路
这道题需要把一个字符串变成ZigZag的排列后按行输出。所以我们只需要依次判断每个字符应该出现在ZigZag排列中的哪一行就可以了。
对于一个N
行的ZigZag排列,我们可以把它看作一个周期为2N - 2
的循环。在这个周期内,如果一个字符位于周期的前N
位,
那么它的位数就是行号。如果在N
位置后,那么它的行号就是超出部分的倒序,如N + 1
那么,行号就是N - 1
. (以上行号,从1开始计)
示例代码 (python)
1 | class Solution(object): |
复杂度分析
时间复杂度: O(n)
其中n
为s
的长度
空间复杂度: O(n)
归纳总结
这道题难度不高, 只需要考虑清楚字符串转换前后的对应关系即可。