public class ZConvert {
public String convert(String s, int numRows) {int n = s.length(), r = numRows;
if (r == 1 || r >= n) {return s;}
StringBuffer[] mat = new StringBuffer[r];
for (int i = 0; i < r; ++i) {mat[i] = new StringBuffer();}
// 一个周期元素个数 = numRows + (numRows - 2);
int t = 2 * (numRows - 1);
// 指标字符串共须要 (n/t) + 1 个周期
int tCount = (n/t) + 1;
// 以后遍历的下标
int index = 0;
for (int i = 0; i < tCount; i++) {
// 以后周期下标 <= 字符串长度
if (index+t <= n) {
// 截取以后周期的字符
processT(s.substring(index, index+t), numRows, t, mat);
} else {processT(s.substring(index, n), numRows, t, mat);
}
index += t;
}
StringBuffer ans = new StringBuffer();
for (StringBuffer row : mat) {ans.append(row);
}
return ans.toString();}
public void processT(String sSub, int numRows, int t, StringBuffer[] mat) {
int count = t;
// 子串的长度 小于 周期
if (sSub.length() < t) {
// 从新赋值子串遍历个数
count = sSub.length();}
for(int i = 0; i < count; i++){char ele = sSub.charAt(i);
// 遍历次数 小于 t-(numRows-2)
if (i < t-(numRows-2)) {
// 间接追加以后字符
mat[i].append(ele);
}
if (i >= t-(numRows-2)) {// 遍历次数 大于等于 t-(numRows-2)
int matIndex = numRows-(i+1)%numRows-1;
// mat 的下标 = numRows-(i+1)%numRows-1
mat[matIndex].append(ele);
}
}
}
public static void main(String[] args) {
String s = "PAYPALISHIRING";
String target = "PAHNAPLSIIGYIR";
String result = new ZConvert().convert(s, 3);
Assert.check(target.equals(result), "失败");
System.out.println("胜利!");
}
}