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