思路:
题目要求我们将一个字符串变成一个z型矩阵然后按照层序输出,以题目样例举例
字符串"PAYPALISHIRING" 转换为矩阵如下
P I N
A L S I G
Y A H R
P I
然后得到的答案是:"PINALSIGYAHRPI"
第一个字符 ‘P’ 输出了之后,应该中间应该间隔 k = numRows*2-2 个字符,即6个字符,才能到下一个应该输出的字符 ‘I’ ,然后再到下一个字符又要间隔k个字符。
但是到了第二行,由于还要计算z型矩阵斜边上的字符,所以下一个字符应该间隔 x = k-2 个字符,然后再间隔 k - x 个字符,然后再间隔 x 个字符依次类推,知道访问下标大于字符串长度,第三行也是同样。
最后一行则与第一行情况相同。
因此只需要对第一行和最后一行特殊处理,然后其他行按照以上规律就可以了。
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1) return s;
int k = numRows*2-2;
int startIndex = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numRows && i < s.length(); i++) {
int p = startIndex;
int x = k-i*2;
sb.append(s.charAt(p));
while(true) {
if(x != 0) { // x == 0时为第一行
p = p+x;
if(p >= s.length())break;
sb.append(s.charAt(p));
}
if(k-x != 0) { //k - x == 0时为最后一行
p = p+k-x;
if(p >= s.length())break;
sb.append(s.charAt(p));
}
}
startIndex++;
}
return new String(sb);
}
}