The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N A P L S I I G Y I RAnd then read line by line:
"PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return
"PAHNAPLSIIGYIR"
.
Subscribe to see which companies asked this question
首先我们从简单的例子找一下规律,我们不看真的字母排序而是指看字母所在位置的排序。假设我们有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