ZigZag Conversion 锯齿形转换字符串

思路:根据锯齿形状,可以得到结论

第i行的字符下标之间的距离是(nRows-1-i)*2和2*i,如下图所示:

0            6

1      5    7

2   4       8

3             9

根据这个规律,遍历每一行的元素,得到转换后的字符串。

注意两点:

1. 当s.length <= nRows || nRows == 1时,无需转换,直接返回,否则会超时。

2. 在遍历每一行时,每一行的while条件是下标值<s.length。根据上面的规律,在第一行和最后一行的间隔,都是(nRows-1-i)*2,应分类讨论。

public String convert(String s, int nRows) {
        int length = s.length();
    	if(length <= nRows || nRows == 1){
    		return s;
    	}
    	 String ret = "";
    	 int start = 0,interval1 = 0,interval2 = 0,time = 1;
    	 for(int i = 0;i<nRows;i++){
    	 	start = i;
    	 	time = 1;
    	 	interval1 = (nRows-1-i)*2;
    	 	interval2 = 2*i;
     		while(start < length){
     			ret += s.charAt(start);
     			if(interval1 == 0){//如果是最后一行
     			   start += interval2; 
     			}
     			if(interval2 == 0){//如果是第一行
     			    start += interval1; 
     			}
     			if(interval1 != 0 && interval2 != 0){//如果是其他行
         			if(time%2 == 1){
         				start += interval1;
         			}else{
         				start += interval2;
         			}
         			time++;
     			}
     		}
     	}
     	return ret;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值