leetcode.6. Z 字形变换

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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值