package com.fishercoder.solutions;

/**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 code that will take a string and make this conversion given a number of rows:

 string convert(string text, int nRows);
 convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

 */

public class _6 {

	public String convert(String s, int numRows) {
		StringBuilder[] sb = new StringBuilder[numRows];
		char[] c = s.toCharArray();
		int len = s.length();
		for (int i = 0; i < numRows; i++) {
			sb[i] = new StringBuilder();//this is an important step to initialize it
		}
		int i = 0;
		while (i < len) {
			for (int index = 0; index < numRows && i < len; index++) {
				sb[index].append(c[i++]);// vertically down
			}

			for (int index = numRows - 2; index >= 1 && i < len; index--) {
				/**Why it should start from numRows - 2? Think of the example when numRows = 3
				 the starting point of obliquely going up is 1, which is numRows-2.*/
				sb[index].append(c[i++]);// obliquely up
			}
		}

		for (i = 1; i < numRows; i++) {
			sb[0].append(sb[i]);
		}
		return sb[0].toString();
	}

}

@@ -32,16 +32,47 @@
 ns;%0A%0A/**
+%0A * 6. ZigZag Conversion%0A *%0A * 
 The stri
@@ -158,16 +158,19 @@
 ke this:
+%0A *
  (you ma
@@ -281,16 +281,17 @@
   I   R%0A
+%0A
  And the
@@ -459,16 +459,16 @@
 nRows);%0A
+
  convert
@@ -521,17 +521,16 @@
 IGYIR%22.%0A
-%0A
  */%0A%0Apub

refactor 6