这个题目还是蛮有意思的,简单来说,就是如下表格:
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 特殊情况只有一行的直接输出,只有空的直接输出空值。
扫描二维码关注公众号,回复:
2703594 查看本文章
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));
}
}