LeetCode算法题 -- 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)
1 | P A H N |
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”.
题目的大意是给定一个字符串和行数,然后之字形转换字符串,按行输出结果。 比如”zigzagconversion”转换成4行的之字形如下:
按行输出的结果就是zcsigoriganeozvn
.
要求按行输出的话就要确定每一行的字符序列, 通过观察发现第一行和最后一行的规律是相邻的相隔 2 * rowNum - 2
个,
中间的那些行比较特殊, 如上图中的 g
、 r
、 a
、 e
, 除了这几个之外其余的也是遵循相邻的相隔2 * rowNum - 2
个, 进一步观察发现第 2 行 中的 g
、 r
依次是o
、i
减 2, 第 3 行 中的 a
、 e
依次是n
、o
减 4, 即 第 i 行的元素依次是i
、 i + 2 * rowNum - 2 - 2 * i
、 i + 2 * (2 * rowNum - 2) - 2 * i
、...
.
最终的JavaScript实现如下:
1 | /** |
时间复杂度为O(n).
本文作者 : Shuai Liang
原文链接 : http://liangshuai.me/2016/07/06/zigzag-conversion/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
知识 & 情怀 | 二者兼得