【leetcode】Zigzag链条数字

这个题目还是蛮有意思的,简单来说,就是如下表格:

1 7 13 
268121418
359111517
4 10 16 

具体来说就是上下上下,然后再按照行把列表输出出来。我们只要得到每一行的规律就行了。

比如如上的链条数就是:1 7 13 2 6 8 12 14 18 3 5 9 11 15 17 4 10 16

可以看到,根据排列的行数不同,数字的规律也不同,假设一共有n行,那么,第一行和最后一行,每两个数之间间隔为2n-2

比如n=4 第一行和最后一行每个数字差距为 2*4-2 = 6  。

其余的行,其实每间隔一个数也是按照2n-2排列的。如n=4时的上表,2和4之间相差4 12和8之间也相差4;5和2之间相差2,9和11之间也相差2 。

我猜测规律如下:对于非首尾行,每次两个数字一组,各组首位数字相差为2n-2,各组数字之间相差为2n-2-2(i-1) 其中i为当前的行数,比如第二行每次就差6-2*1=4  第三行每次差6-2*2 = 2。为了验证,我们试试n=5时的排列情况:

1 9 17
28101618
37111519
46121420
5 13 21

我们可以看到,第二行每组间差了6 而按照公式 2*5-2-2*1 = 6 。第三行每组之间差了4  ,而2*5-2-2*2 = 4。由此类推,根据归纳的结果,我们可以判定解决n行的算法是如下的:

1.首尾两行每次增加2n-2个数字。

2.非首尾两行的每次增加一组两个数字,每组之间间隔为2n-2 组内间隔为2n-2-2(i-1) 其中i为当前行数。

3 特殊情况只有一行的直接输出,只有空的直接输出空值。

java实现的代码如下所示:

public class Solution {
	public String convert(String s, int numRows) {
		if (s.length()==0||numRows<=0)
			return "";
	    if (numRows==1)
	    	return s;	    
	    String res = ""; 
	    int interval = 2*numRows - 2,temp = 0;
	    for(int j=0;j<numRows;j++) {
	    	if(j == 0) {
	    		for(int i = 0;i<s.length();i+=interval)
	    			res+=String.valueOf(s.charAt(i));
	    	}
	    	else if(j == numRows-1){
	    		for(int i = numRows-1;i<s.length();i+=interval)
	    			res+=String.valueOf(s.charAt(i));
	    	}
	    	else {
	    		for(int i =j;i<s.length();i+=interval) {
	    			res+=String.valueOf(s.charAt(i));
	    			temp = i+interval-2*j;
	    			if(temp<s.length())
	    				res+=String.valueOf(s.charAt(temp));
	    		}
	    	}
	    }
        return res;
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s = "ASGSFARQVADA";
		System.out.println(new Solution().convert(s, 3));
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值