解题思路
这个题目我是分2种情况来考虑的,考虑首行和最后一行,每个数的间隔是2*(numRows-1), 对于中间其他行,那么的间隔是2*(numRows-1)-2*row或者2*row, 其中row表示当前所在的行号。算法是逐行扫描,计算当前符号在输入字符串中的位置,而对应转换后的位置不断加1就可以了。可以看下面的图:
- 首行和尾行
- 其他行
参考源码
public class Solution {
public String convert(String s, int numRows) {
if (numRows <= 1) {
return s;
}
int len = s.length();
char[] cs = new char[len];
int newpos = 0;
for (int row = 0; row < numRows; row++) {
//first or last row
if (row == 0 || row == numRows - 1) {
int pos = row;
while (pos < len && newpos < len) {
cs[newpos] = s.charAt(pos);
newpos++;
pos += 2 * (numRows - 1);
}
} else {
int pos = row;
int dir = 0;
while (pos < len && newpos < len) {
cs[newpos] = s.charAt(pos);
newpos++;
if (dir == 0) {
pos += 2 * (numRows - 1) - 2 * row;
dir = 1;
} else if (dir == 1) {
pos += 2 * row;
dir = 0;
}
}
}
}
return new String(cs);
}
}