Problem Statement
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:
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P ISolution
If you look the pattern, its going in two directions:
- Top to bottom straight
- Bottom to top with one incremented index
You need one flag to indicate whether you are going downward or going upward.
Algorithm
- Maintain a flag to indicate whether you are going upward or downward. Reset boundaries are on 0-index and length-1 index.
- Toggle the flag on reaching boundaries (top most, or bottom most)
- Maintain a List of string(StringBuffer in Java). List length is equal to the number of rows asked.
- Maintain a variable which will tell you in which stringbuffer(row num) to add the current character
Code
public class Q6_ZigZagConversion {
private String str;
public Q6_ZigZagConversion(String str) {
this.str = str;
}
public String conversion(int numRows) {
int l = this.str.length();
List<StringBuffer> zigzag = new ArrayList<StringBuffer>();
for (int i=0; i<numRows; i++) {
zigzag.add(new StringBuffer());
}
boolean comingFromTop = true;
int zig = 0;
for (int i=0; i<l; i++) {
zigzag.get(zig).append(this.str.charAt(i));
if (zig == numRows-1) {
comingFromTop = false;
}
else if (zig == 0) {
comingFromTop = true;
}
zig = comingFromTop ? zig + 1 : zig - 1;
zig = zig % numRows;
}
StringBuffer sb = new StringBuffer();
for (int i=0; i<numRows; i++) {
sb.append(zigzag.get(i));
}
return sb.toString();
}
}












