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>

  1. Hao Kuang on 2015-7-18

    The examples should be given at least 3 and 4.

  2. Brandon Donnelson on 2016-12-3

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

  3. Hello on 2016-12-30


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

Leave a comment

*