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();
}

5 thoughts on “LeetCode – ZigZag Conversion (Java)”

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

  2. 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 ?


  3. 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];
    }
    }

  4. 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();
    }

Leave a Comment