思路1:String[numRow]行字符串数组。读取原始字符串每一个字符,设置行变量 nrow和行标志位flag(向下一行为1或向上一行为-1)。将该字符连接到数组中对应的行字符串,同时nrow+=flag。
1 public String convert(String s, int numRows) {
2 if(s==null||s.length()==0||numRows<=1){
3 return s;
4 }
5 String[] strRowArr=new String[numRows];
6 Arrays.fill(strRowArr, "");
7 int flag=1; //向下走为1,向上走位-1
8 int nrow=0; //当前字符应该在的行
9 for(int i=0;i<s.length();i++){
10 char t=s.charAt(i);
11 strRowArr[nrow]+=t;
12 nrow+=flag;
13 if(nrow>=numRows){
14 //nrow已经越下界,更新为倒数第二行,标志flag也变为-1
15 nrow=(numRows-1)-1;
16 flag=-1;
17 }
18 if(nrow<0){
19 //nrow已经越上界,更新为第二行,标志位flag变为1
20 nrow=1;
21 flag=1;
22 }
23 }
24 //行字符串数组 拼接成一个完整的字符串
25 String rowString="";
26 for(String str:strRowArr){
27 rowString+=str;
28 }
29 return rowString;
30 }
思路2:每一行必然包含间隔为 2*numRows-2的字符 , 中间行间隔还需要加上2*numRows-2-2*i
1 public String convert(String s, int numRows){
2 if(s==null||s.length()==0||numRows<=1){
3 return s;
4 }
5 int tag=2*numRows-2;
6 String result="";
7 for(int i=0;i<numRows;i++){ //i行
8 for(int j=i;j<s.length();j+=tag){//读取每一行应该有的字符
9 result+=s.charAt(j);
10
11 //如果是非首行和尾行,还需要添加tag间隔中间字符
12 if(i>0&&i<numRows-1){
13 int t=j+tag-2*i;
14 if(t<s.length()){
15 result+=s.charAt(t);
16 }
17 }
18 }
19 }
20 return result;
21 }