【leetcode】Zigzag链条数字

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

1   7   13  
2 6 8 12 14 18
3 5 9 11 15 17
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
2 8 10 16 18
3 7 11 15 19
4 6 12 14 20
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));
	}

}

猜你喜欢

转载自blog.csdn.net/qq_31548387/article/details/81461747