这道题让我debug了好久好久,但是整体思路一直是比较清晰的
我的方法:
用二位数组来模拟一次过程的进行,将结果读取出来
public class Solution {
public String convert(String s, int numRows) {
int strlength = s.length();
// 首先是3种特殊情况
if(strlength == 0) return "";
if(numRows == 1) return s;
if(numRows == 2) {
char[] sa = s.toCharArray();
char[] newS = new char[strlength];
for(int i=0;i<strlength;i++){
int middle = (strlength%2 == 0)?(strlength/2):((strlength+1)/2);
int j = (i%2 == 0)?(i/2):(middle+(i-1)/2);
newS[j] = sa[i];
}
return new String(newS);
} else {
char[] sa = s.toCharArray();
int numX = (numRows-2 > 0)?(numRows-2):0;
int numGroup = numRows+numX;
int col = ((strlength-1)/numGroup)*(numX+1);
int yu = (strlength-1)%numGroup;
if(yu < numRows){
col++;
} else {
col += (yu+2)-numRows;
}
char[][] newStr = new char[numRows+1][col+1];
for(int i=0;i<strlength;i++){
int x,y;
int n = i/numGroup;
int m = i%numGroup;
if(m < numRows){
y = n*(numX+1);
x = m;
} else {
y = n*(numX+1)+(m-numRows)+1;
x = 2*numRows - 2 - m;
//x = (numRows-1)- (m-(numRows-1));
}
newStr[x][y] = sa[i];
}
char[] newString = new char[strlength];
int count = 0;
for(int i=0;i<numRows;i++){
for(int j=0;j<col;j++){
if(newStr[i][j]!=0){
newString[count++]=newStr[i][j];
}
}
}
return new String(newString);
}
}
}
// ps:char的初值为0,和character的初值才是null
只有对象object的初值才可以是null,基本类型的初始值则不可以是null
大神的算法(最简单的):
关键词:StringBuilder的数组
在这个算法中也可以看出,思维的简洁性
比如我的算法中,是用计算的方法来获取每一个值对应的,横,纵坐标。是模拟结果
然而在这个算法里,在求横坐标的时候,使用了前一个坐标的+1或者-1来表示
public class Solution {
public String convert(String s, int numRows) {
if(numRows<=1)return s;
StringBuilder[] sb=new StringBuilder[numRows];
for(int i=0;i<sb.length;i++){
sb[i]=new StringBuilder(""); //init every sb element **important step!!!!
}
int incre=1;
int index=0;
for(int i=0;i<s.length();i++){
sb[index].append(s.charAt(i));
if(index==0){incre=1;}
if(index==numRows-1){incre=-1;}
index+=incre;
}
String re="";
for(int i=0;i<sb.length;i++){
re+=sb[i];
}
return re.toString();
}