# LeetCode – ZigZag Conversion (Java)

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 a method convert("PAYPALISHIRING", 3) which returns "PAHNAPLSIIGYIR".

Java Solution

```public String convert(String s, int numRows) { if (numRows == 1) return s;   StringBuilder sb = new StringBuilder(); // step int step = 2 * numRows - 2;   for (int i = 0; i < numRows; i++) { //first & last rows if (i == 0 || i == numRows - 1) { for (int j = i; j < s.length(); j = j + step) { sb.append(s.charAt(j)); } //middle rows } else { int j = i; boolean flag = true; int step1 = 2 * (numRows - 1 - i); int step2 = step - step1;   while (j < s.length()) { sb.append(s.charAt(j)); if (flag) j = j + step1; else j = j + step2; flag = !flag; } } }   return sb.toString(); }```
Category >> Algorithms >> Interview >> Java
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
```<pre><code>
String foo = "bar";
</code></pre>
```
• Turk Turkleton

What exactly is a Zigzag pattern? why is the 2nd column only having 1 character? I’ve been googling around and not finding out what they want.

• alexwest11

not sure what is point in this ?

lets say someone will ask / and now print those chars in true zigzag fashion w/ proper number of blanks on each line/
what should i do ? write another piece of code?

better either return array of strings, at least it is clear what to do next, or insert proper number blanks into string

to get same length for each line

what do you think ?

• Hello

``` string s; cin>>s; int k; cin>>k; vector v[k]; bool swapping; for(int i = 0; i < s.length(); i++){ if(i%(2*k-2)==0)swapping=true; else if(i%(k-1)==0)swapping=false;```

``` int tmp = i%(k-1); if(swapping){ result[tmp].push_back(s[i]); } else{ result[k-1-tmp].push_back(s[i]); } } for(int i = 0; i < k; i++){ for(int j = 0; j < v[i].size(); j++){ cout<<v[i][j]; } } ```

• Brandon Donnelson

Here is an alternative solution that works.

``` public String convert(String s, int numRows) { if (numRows == 1) { return s; }```

``` List<List> rows = new ArrayList<List>(); for (int i = 0; i < numRows; i++) { rows.add(new ArrayList()); } boolean add = true; int z = 0; for (int i = 0; i = numRows-1) { add = false; } else if (!add && z <= 0) { add = true; } if (add) { z++; } else { z--; } } StringBuffer sb = new StringBuffer(); for (int i = 0; i < numRows; i++) { sb.append(String.join("", rows.get(i))); } ```

``` return sb.toString(); } ```

• Hao Kuang

The examples should be given at least 3 and 4.