对字符串z字变换之后,第一行和最后一行是一种情况,中间几行是几种情况; 首先要输出第一行的字符,是从下标为0开始的,然后的每个下标都加2numRows-2,直到超出数组长度为止; 再输出中间几行的字符,与第一行不同的是,两个下标相差2numRows-2的字符中间,夹着一个字符,通过推算可知,若该行是第i行,则中间这个字符的下标为该字符前一个字符的下标(该字符前一个字符的下标符合相差2*numRows-2的规律,易求得)加上(numRows-i)*2,知道字符的下标,就可以循环打印了, 最后一行与第一行输出方式相同,但是开始下标为strlen(s)-1;
class Solution {
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();
}
for (int i=0,x=0,t=r*2-2;i<n;i++) {
mat[x].append(s.charAt(i));
if (i%t<r-1) {
++x;
} else {
--x;
}
}
StringBuffer ans = new StringBuffer();
for (StringBuffer row : mat) {
ans.append(row);
}
return ans.toString();
}
}