方法一:
这个方法是我最初想到的,不过时间花费较多,有无用功。
核心思想就是用一个辅助数组存储,然后横向遍历得到。
AC代码如下:
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
int i=0,j=0,col=0;
char[][] array=new char[numRows][s.length()];
boolean down=true;
for(int cur=0;cur<s.length();){
while(down&&cur<s.length()){
array[i][col]=s.charAt(cur);
cur++;
i++;
if(i==numRows){
i=i-1;
down=false;
}
}
if(cur>=s.length())
break;
col=col+numRows-1;
while((!down)&&cur<s.length()){
i--;
j++;
array[i][j]=s.charAt(cur);
cur++;
if(i==0){
down=true;
cur--;
}
}
if(cur>=s.length())
break;
}
StringBuilder sb=new StringBuilder();
for(i=0;i<array.length;i++)
for(j=0;j<array[0].length;j++){
char c=array[i][j];
if(c!='\u0000')
sb.append(String.valueOf(c));
}
return sb.toString();
}
}
方法二:
这个方法是看评论得到的,仔细想了想,感觉比较好,找到规律就SoEasy了。
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1)
return s;
StringBuilder sb=new StringBuilder();
int n=s.length();
int step=2*numRows-2;
for(int i=0;i<numRows;i++)
for(int j=i;j<n;j+=step){
sb.append(s.charAt(j));
int temp=j+step-2*i;
if(i!=0&&i!=numRows-1&&temp<n)
sb.append(s.charAt(temp));
}
return sb.toString();
}
}