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>
  • 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.