1 public class Solution {
2 public String convert(String s, int numRows) {
3 // illegal parameters
4 if(s == null || s.length() == 0 || numRows <= 0) {
5 return s;
6 }
7
8 if(s.length() <= numRows || numRows == 1) {
9 return s;
10 }
11
12
13 // get column numbers of array
14 int numCols = 0;
15 int len = s.length();
16 while(len > 0) {
17 len -= numRows * 2 - 2;
18 numCols += numRows - 1;
19 }
20
21 StringBuilder res = new StringBuilder();
22 Character[][] array = new Character[numRows][numCols];
23 boolean isDown = true;
24 int rowIndex = 0;
25 int colIndex = 0;
26
27 for(int i = 0; i < s.length(); i++) {
28 Character c = s.charAt(i);
29 array[rowIndex][colIndex] = c;
30 if(isDown) {
31 // going down direction
32 rowIndex++;
33 if(rowIndex == numRows) {
34 // time to change to lean direction
35 isDown = false;
36 rowIndex -= 2;
37 colIndex++;
38 }
39 } else {
40 // going lean direction
41 if(rowIndex == 0) {
42 // time to change to down direction
43 isDown = true;
44 rowIndex++;
45 } else {
46 rowIndex--;
47 colIndex++;
48 }
49 }
50 }
51
52 for(int i = 0; i < numRows; i++) {
53 for(int j = 0; j < numCols; j++) {
54 Character c = array[i][j];
55 if(c == null) {
56 continue;
57 } else {
58 res.append(c);
59 }
60 }
61 }
62
63 return res.toString();
64 }
65 }