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)

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".


解题思路:

 这道题就是看坐标的变化。并且需要分块处理。

 n=2时,字符串坐标变成zigzag的走法就是:

 0 2 4 6

 1 3 5 7

 n=3时的走法是:

 0     4     8

 1  3 5  7 9

 2     6    10 

 n=4时的走法是:

 0      6        12

   5 7    11 13

 2 4   8 10    14

 3      9         15 

 可以发现规律,画红色的长度永远是 2n-2 (想法是你试想把所有这些行压缩成两列,两边手挤一下,第二列永远的第一行和最后一行少字)。

 利用这个规律,可以按行填字,第一行和最后一行,就是按照2n-2的顺序一点点加的。

 其他行除了上面那个填字规则,就是还要处理斜着那条线的字,可以发现那条线的字的位置永远是当前列j+(2n-2)-2i(i是行的index)。 


 java code:

 1 public class ZigzagConversion {
 2     public String convert(String s, int numRows) {
 3         if(s == null || s.length()==0 || numRows <=0)
 4             return "";
 5         if(numRows == 1)
 6             return s;
 7 
 8         StringBuilder result = new StringBuilder();
 9         int size = 2*numRows-2;
10         for(int i = 0; i< numRows; i++) {
11             for(int j = i; j< s.length(); j+=size) {
12                 result.append(s.charAt(j));
13                 if(i !=0 && i != numRows-1) { // if i is not the first and last row
14                     int temp = j+size-2*i;
15                     if(temp < s.length())  {
16                         result.append(s.charAt(temp));
17                     }
18                 }
19             }
20         }
21         return result.toString();
22     }
23 }

Reference:

1. http://www.cnblogs.com/springfor/p/3889414.html