class Solution {
public String convert(String s, int numRows) {
int r=0;
int t=0;
char charArray[]=s.toCharArray();
if(numRows>1) {
t=numRows-2+numRows;//计算周期t
r=s.length()/t*(t/numRows+t%numRows);
if(s.length()%t!=0) {
if((s.length()%t)/numRows!=0)
r+=(s.length()%t)%numRows+1;
else
r+=1;
}
}
else
return s;
char save[][]=new char[numRows][r];
int j=1;
int x,y;
x=y=0;
int n=0;
save[0][0]=s.charAt(0);
for(int i=1;i<s.length();i++) {
j++;
if(j<=numRows) {
save[x+1][y]=s.charAt(i);
x=x+1;
}
if(j>numRows&&j<=t) {
System.out.println("2 "+j);
save[x-1][y+1]=s.charAt(i);
x=x-1;
}
if(j>numRows-2+numRows) {
j=1;
save[0][n+numRows-1]=s.charAt(i);
y=n+numRows-1;
n=n+numRows-1;
x=0;
}
}
StringBuffer buffer=new StringBuffer();
for(int i=0;i<save.length;i++) {
for(int k=0;k<save[i].length;k++) {
if(save[i][k]!=0) {
buffer.append(save[i][k]);
}
}
}
return new String(buffer) ;
}
}
这个题目不难主要思考数组坐标变换。我的思路是先把字符串的每一位按坐标变换填入save[][]的数组里,然后用StringBuffer判断一个个判断每个数组元素的ASCII是否是0(默认值),如果不是默认值就把这个值apend进去。最后就把这个buffer转换成String返回。
我在数组内存空间上做了比较细的思考,确切得算出了每一个测试例子所需得数组空间。数组的行数显然是numRows,无须解释。第二个列数就需要思考,我把字符最多那行作为列数(显然0也是要算进去的)。
r=s.length()/t*(t/numRows+t%numRows);
这个式子略长,一步步分析。
s.length()/t算出整周期数,(t/numRows+t%numRows)算出整周期需要的列数。这两个相乘显然算出整周期所需列数
if(s.length()%t!=0) {
if((s.length()%t)/numRows!=0)
r+=(s.length()%t)%numRows+1;
else
r+=1;
}
这部分主要用来算整周期之外多余的。这个也要分两种一种没超过numRows,一种超过了numRows,没超过的r+=1就ok了。
超过了的,就必须r+=(s.length()%t)%numRows+1;