解題思路
這個題目我是分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);
}
}