Skip to content

Commit 04d0767

Browse files
committed
ZigZag
Refine solution
1 parent 790b040 commit 04d0767

File tree

1 file changed

+35
-20
lines changed

1 file changed

+35
-20
lines changed

ZigZagConversion.java

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,38 @@
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

Comments
 (0)