https://leetcode.com/problems/zigzag-conversion/
原题如上。
题意解析:给你一个字符串,并告诉你行数,你要把字符串按N字型摆放后,一行一行读出结果。
例如:给出字符串ABCDEFGHIJ,行数为2,那么,把字符串按N字型摆放之后,就变成了
A C E G I
B D F H J
如果,行数为3,就变成了
A E I
B D F H J
C G
如果行数为4,就变成了
A G
B F H
C E I
D J
由上往下再往上。。。。。。
解题思路:
A G
B F H L
C E I K
D J
把它转换为用下标表示
1 7
2 6 8 12
3 5 9 11
4 10
发现有两类向量
1 7 6 12
2 8 以及 5 11
3 9
4 10
每类向量内部,有一个等差关系,在这里都是相差6
6=numRows+numRows-2
细心阅读的题目的同学,已经发现规律了,这里点到即止
解题源代码:
public String convert(String s, int numRows) {
//字符个数
int n=s.length();
//边界条件
if(numRows>=n || numRows<=1) return s;
//步长
int step=numRows+numRows-2;
//结果容器
StringBuffer sb=new StringBuffer();
//计算两个索引数组
int[] index1=new int[numRows];
int[] index2=new int[numRows];
//填充两个索引数组
int j=0;
for(int i=0;i<numRows;i++){
index1[i]=j++;
}
index2[0]=-1;
index2[numRows-1]=-1;
for(int i=numRows-2;i>0;i--){
index2[i]=j++;
}
//填充结果容器
for(int i=0;i<numRows;i++){
int k=0;
int ind;
while((ind=index1[i]+k*step)<n){
sb.append(s.charAt(ind));
if(index2[i]!=-1 && (ind=index2[i]+k*step)<n){
sb.append(s.charAt(ind));
}
k++;
}
}
//返回结果容器
return sb.toString();
}