这道题让我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(); }