1717 * convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".
1818 */
1919
20- public class ZigZagConversion {
21- public String convert (String s , int nRows ) {
22- if (nRows <= 1 || s .length () < 2 )
23- return s ;
24- ArrayList <StringBuilder > sbs = new ArrayList <StringBuilder >();
25- for (int k = 0 ; k < nRows ; k ++) {
26- sbs .add (new StringBuilder ());
27- }
28- int nCount = 2 * (nRows - 1 );
29- for (int i = 0 ; i < s .length (); i ++) {
30- sbs .get (nRows - 1 - Math .abs (nRows - 1 - (i % nCount ))).append (
31- s .charAt (i ));
32- }
33- StringBuilder sb = new StringBuilder ();
34- for (int j = 0 ; j < nRows ; j ++) {
35- sb .append (sbs .get (j ));
36- }
37- return sb .toString ();
38- }
39- }
20+ class ZigZagConversion {
21+ public String convert (String s , int numRows ) {
22+ if (numRows <= 1 ) {
23+ return s ;
24+ }
25+ // Row index of each char in ZigZag form
26+ int [] rowIndex = new int [s .length ()];
27+ int row = -1 ;
28+ boolean down = true ; // Simlate the movement of ZigZag, up or down
29+ for (int i = 0 ; i < rowIndex .length ; i ++) {
30+ if (down ) {
31+ row += 1 ;
32+ rowIndex [i ] = row ;
33+ if (row == numRows - 1 ) {
34+ down = false ;
35+ }
36+ } else {
37+ row -= 1 ;
38+ rowIndex [i ] = row ;
39+ if (row == 0 ) {
40+ down = true ;
41+ }
42+ }
43+ }
44+ StringBuilder sb = new StringBuilder ();
45+ for (int c = 0 ; c < numRows ; c ++) {
46+ for (int i = 0 ; i < rowIndex .length ; i ++) {
47+ if (rowIndex [i ] == c ) {
48+ sb .append (s .charAt (i ));
49+ }
50+ }
51+ }
52+ return sb .toString ();
53+ }
54+ }
0 commit comments