思路:根据锯齿形状,可以得到结论
第i行的字符下标之间的距离是(nRows-1-i)*2和2*i,如下图所示:
0 6
1 5 7
2 4 8
3 9
根据这个规律,遍历每一行的元素,得到转换后的字符串。
注意两点:
1. 当s.length <= nRows || nRows == 1时,无需转换,直接返回,否则会超时。
2. 在遍历每一行时,每一行的while条件是下标值<s.length。根据上面的规律,在第一行和最后一行的间隔,都是(nRows-1-i)*2,应分类讨论。
public String convert(String s, int nRows) {
int length = s.length();
if(length <= nRows || nRows == 1){
return s;
}
String ret = "";
int start = 0,interval1 = 0,interval2 = 0,time = 1;
for(int i = 0;i<nRows;i++){
start = i;
time = 1;
interval1 = (nRows-1-i)*2;
interval2 = 2*i;
while(start < length){
ret += s.charAt(start);
if(interval1 == 0){//如果是最后一行
start += interval2;
}
if(interval2 == 0){//如果是第一行
start += interval1;
}
if(interval1 != 0 && interval2 != 0){//如果是其他行
if(time%2 == 1){
start += interval1;
}else{
start += interval2;
}
time++;
}
}
}
return ret;
}