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"
.
思路:
首先,我们需要弄清楚这个ZigZag是怎么排列的,这个单词直译过来就是折线、之字形的,在这里不好具体表达,直接放一张图在下面,大家感受一下就知道了。下面分别是行数为5行、8行、10行的情况下的打印图
通过上面的图我们知道,这种排列是有周期的,一个“V”字形为一个周期,我们知道除了第一行和最后一行没有重叠,其他行都有重叠,所以周期为period = 2*nRows-2。所以,我们打印的时候可以之间根据这个周期来进行按行打印。
我们假设设定的共有n行,
所以,代码如下:
1 public String convert(String s, int numRows) {
2 if(s == null || s.length() <= numRows || numRows == 1){
3 return s ;
4 }
5 StringBuilder res = new StringBuilder() ;
6 char [] arr = s.toCharArray() ;
7 int period = 2*numRows - 2 ;
8 for(int i = 0 ; i < numRows ; i++){
9 for(int j = i ; j < s.length(); j += period){
10 if((period-i)%period != i){
11 res.append(arr[j]) ;
12 if((j+period-2*i) < s.length()){
13 res.append(arr[j+period-2*i]) ;
14 }
15 }else{
16 res.append(arr[j]) ;
17 }
18 }
19 }
20
21 return res.toString() ;
22 }