这个问题困扰了我一个下午!!!
首先我们从简单的例子找一下规律,我们不看真的字母排序而是指看字母所在位置的排序。假设我们有n个字母,那么我们就有1到n这n个位置。
一: 2排的时候,1到n的排序
1 3 5 7 9
。。。
2 4 6 8 10 。。。
二: 3排的时候,1到n的排序
1
5
9
。。。
2 4 6 8 10 。。。
3
7
11 。。。
三: 4排的时候,1到n的排序
1
7
13 。。。
2
6 8
12 14 。。。
3 5
9
11
15 。。。
4
10
16 。。。
这到规律没有?如果没有找到, 你可以继续写5排的情况。很快你就可以找到规律。这是一个解决问题问题的方法。当我们遇到难缠的问题的时候,我们先考虑简单的情形,看看能不能找到规律。这个题目,我们通过写出来这些特殊情况,我们发现如下规律,这里我们假设我们分成m排:
1 第i排从i开始
2 第i排两个数的间隔是2(i-1),2(m-i)交替
下面的代码通过了LeetCode online judge large
01 string
convert(string
s,
int
nRows)
{
02
string
result;
03
04
if(nRows
==
1)
{
05
return
s;
06
}
07
08
for(
int
i
=
0;
i
<
nRows;
i++)
{
09
int
j
=
i;
10
bool
flag
=
true;
11
while(j
<
s.size())
{
12
result.push_back(s[j]);
13
14
if(i
==
0
||
i
==
nRows
-
1)
{
15
j
+=
2
*
(nRows
-
1);
16
}
17
else
{
18
if(flag)
{
19
j
+=
2
*
(nRows
-
1
-
i);
20
flag
=
false;
21
}
22
else
{
23
j
+=
2
*
i;
24
flag
=
true;
25
}
26
}
27
}
28
}
29
return
result;
30 }
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
上面的程序是抄袭别人的 我自己再看了别人的程序的基础之上实现了一个java程序:
public class Solution {
public String convert(String s, int nRows) {
String ss = "";
if(nRows==1||s.length()<=nRows) return s;
//假设行数的编号从一开始,那么每一行的数据都是按照间隔数据的2(i-1)和2(m-i)的间隔交替出现的。
for(int i = 1;i<=nRows;i++){
int m = i;
//最初的间隔是m-i;
int range = 2*(nRows-i);
while(m<=s.length()){
ss+=s.charAt(m-1);
if(i==1||i==nRows){
if(i==1){m+=range;}
if(i==nRows){m+=2*(i-1);}
}else {if(range == 2*(i-1)){
m+=range;
range=2*(nRows-i);
}else{
m+=range;
range=2*(i-1);
}}
}
}
return ss;
}
}