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("胜利!");
}
}
发表回复