leetcode 6. zigzag conversion

6. ZigZag Conversion

Difficulty: Medium

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)

1
2
3
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:

1
string convert(string s, int numRows);

Example 1:

1
2
**Input:** s = "PAYPALISHIRING", numRows = 3
**Output:** "PAHNAPLSIIGYIR"

Example 2:

1
2
3
4
5
6
7
8
**Input:** s = "PAYPALISHIRING", numRows = 4
**Output:** "PINALSIGYAHRPI"
**Explanation:**

P I N
A L S I G
Y A H R
P I

Solution

Language: Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class  {
public String convert(String s, int numRows) {
if (s == null || s.length() == 0 || numRows == 1) {
return s;
}
int l = s.length();
StringBuilder sb = new StringBuilder();
int a = (numRows - 1) * 2;
for (int i = 0; i < numRows; i++) {
int b = a - 2 * i;
for (int j = i; j < l; j += a) {
sb.append(s.charAt(j));
if (b != 0 && b != a && j + b < l) {
sb.append(s.charAt(j + b));
}
}
}
return sb.toString();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class  {
public String convert(String s, int numRows) {
if(s == null || s.length() == 0 || numRows <= 1) {
return s;
}
StringBuilder[] builders = new StringBuilder[numRows];
int cur = 0;
int direction = 1;
for (int i = 0; i < builders.length; i++) {
builders[i] = new StringBuilder();
}
for (int i = 0; i < s.length(); i++) {
builders[cur].append(s.charAt(i));
cur += direction;
if (cur == numRows) {
cur -= 2;
direction = -1;
} else if (cur == -1) {
cur += 2;
direction = 1;
}
}
for (int i = 1; i < builders.length; i++) {
builders[0].append(builders[i]);
}
return builders[0].toString();
}
}