Zigzag Conversion

思路:(1)将每行的字符串存储到字符串数组中的一个字符串中,最后将字符数组中的字符串按顺序连接起来,就是答案。实际上就是按照这个Zigzag形成的过程走一遍,在0或者numRows-1的时候数组下标要发生变化。要注意的是,在字符串数组初始化时,若没有用大括号指定其中每个字符串的,其默认每个初始值为null。

代码:

class Solution {
public String convert(String s, int numRows) {
int n=s.length();
if(n<=1||numRows<=1)
return s;
String[]t=new String[numRows];
for(int i=0;i<numRows;i++)
t[i]="";//这段代码很重要,如果没有,那么t[i]默认为null,在后来t[i]+=s.charAt(j);这句代码执行的过程中,得到的结果就会是"null+s.charAt(j)"
int flag=-1,i=0;
for(int j=0;j<n;j++){
if(i==0||i==numRows-1)
flag=-flag;
t[i]+=s.charAt(j);
i+=flag;
}
String ans="";
for(int k=0;k<numRows;k++)
ans+=t[k];
return ans;
}
}

(2)每一行的字符下标之间存在某种规律。对于第一行和最后一行,每个下标间隔是2*numRows-2;对于非第一行和最后一行,如第i行,其下标间隔是2*numRows-2-2*i或2*i。可以将2*numRows-2设为step,在第i行,第二个字符与第一个字符下标间隔step-2*i,第三个与第二个间隔2*i,依此类推。

代码如下:

class Solution {
public String convert(String s, int numRows) {
int n=s.length();
if(n<=1||numRows<=1)
return s;
String ans="";
int i=0,step=2*numRows-2;
while(i<numRows){
int j=i;
if(i==0||i==numRows-1){
while(j<n){
ans+=s.charAt(j);
j+=step;
}
}
else{
int flag=1;
while(j<n){
ans+=s.charAt(j);
j+=(flag==1)?(step-2*i):2*i;
flag=-flag;
}
}
i++;
}
return ans;
}
}

需要注意的是,这次不再需要创建字符串数组,因为s中的字符按照Z形划分之后,是将一行中所有字符添加到ans中之后再将下一行中的所有字符添加到ans中的。

posted @ 2019-10-09 00:31  xbc121  阅读(96)  评论(0编辑  收藏  举报