# LeetCode 6: ZigZag Conversion （JAVA）

``````給一個String: "PAYPALISHIRING"

P   A   H   N
A P L S I I G
Y   I   R

P     I    N
A   L S  I G
Y A   H R
P     I

``````

``````本題的規律：
/*R=numRows
d=2R-2    1                           2R-1                         4R-3
d=        2                     2R-2  2R                    4R-4   4R-2
d=        3               2R-3        2R 1              4R-5       .
d=        .           .               .               .            .
d=        .       R 2                 .           3R               .
d=        R-1 R 1                     3R-3    3R-1                 5R-5
d=2R-2    R                           3R-2                         5R-4
*/``````

``````假設當前行數是r，總行數R，I(n)表示某行第n個字母在原字串中的index，n從0開始：
r=1或R時:I(n 1) = I(n) 2*(R-1)
1<r<R時:
I(n 1)=I(n) 2*(R-r)，n為偶數
I(n 1)=I(n) 2*(r-1)，n為奇數
``````

``````public static String convert(String s, int numRows) {
if(s == null || s.length() == 0 || numRows ==1 || numRows >= s.length())
return s;
StringBuilder myString = new StringBuilder();
//第1行
for(int i = 1; i < s.length() 1;i =2*(numRows-1))
myString.append(s.charAt(i-1));
//中間
for(int i = 2; i < numRows;i  ) {
boolean k=true;
for(int j = i; j < s.length() 1;j = (k) ? 2*(numRows-i) : 2*(i-1),k=!k)
myString.append(s.charAt(j-1));
}
//第R行
for(int i = numRows;i<s.length() 1;i =2*(numRows-1))
myString.append(s.charAt(i-1));
return myString.toString();
}
``````