Describe:
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)
字符串”PAYPALISHIRING”写的是在一个给定的行数,这样一个曲折的模式:(你可能想在一个固定的字体更加易读显示模式)
也就是说,给定一个字符串和行数,将字符串按照从左至右,从上至下的形式(Z 字形)排列,然后按行输出。如图。
Example:
And then read line by line: (输出)”PAHNAPLSIIGYIR”
string convert(string text, int nRows);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
Point:
1、访问字符串中各个字符:
(1)str[索引值]
(2)str.charAt(索引值)
(3)字符串->数组:str.split(“”)
Step:
1、直接输出情况
当设置的行数为1(1行),直接输出。当行数大于字符串长度时(1列),直接输出。
2、不要太过依赖于数组,找出规律,直接将字符串的字符按规律取出来。
3、计算循环周期
就是说拉链的对应两端隔了几个。如图红色框中的P和A的距离。这样就可以按照排列中的行取出来。
循环周期的公式:2倍的行数 - 2。
var cyc = 2*numRows - 2;
因为,不管行数是多少,两列之间所有的字符都可以缩成一行,但是总会差首行和末行两个字符,加上第一列的字符,得出计算公式。
4、计算中间行的间隔元素
在计算中间行的时候会发现,每行都会有两条拉链之间的间隔元素。并且行数越多,中间的间隔元素也越多。现在固定一行 i,这一行所有间隔元素的循环公式为:列数 + 循环周期 - 2倍行数。
var mid = j + cyc - 2*i;
Code:
Question:
1、最初理解题目有误,是Z字型,而不是方波型。
2、误区:一直想把方波型存成二维数组的形式,然后按行取出。