题目链接:6.Z字形变换

题解:

完全就是找规律,找到每行下标的规律即可,为一个等差数列!

题目简述:

将字符串按倒Z型排列,然后按行读取完整字符,输出对应字符串!

题解:

以一个容易发现规律的例子来解释:

以四行为例:

1
2
3
4
0     6       12
1 5 7 11 13 ..
2 4 8 10 14 16
3 9 15
  1. 第一行和最后一行公差相同,为 2 * n - 2,即从0 - 6 中间隔了1-3 和 4 - 6 即两个 n - 1.
  2. 中间其他行,看做两个等差序列的混合,分别去处理,竖线上的同样是以2 * n - 2为公差的等差数列,不在竖线上的是以2 * n - 2 - i为首项,以2 * n - 2为公差的等差数列!

2 * n - 2 - i:会发现 1 + 5 = 6 2 + 4 = 6,即 i + x = 2 * n - 2x = 2 * n - 2 - i

注意: n = 1时,2 * n - 2为零,循环为死循环,所以进行特判,返回原串 s

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
string convert(string s, int n) {
string str;
if(n == 1) return s;
for(int i = 0; i < n; i++){
if(i == 0 || i == n - 1){
for(int j = i; j < s.size(); j += 2 * n - 2){
str += s[j];
}
}else{
for(int j = i, k = 2 * n - 2 - i; j < s.size() || k < s.size(); j += 2 * n - 2, k += 2 * n - 2){
if(j < s.size()) str += s[j];
if(k < s.size()) str += s[k];
}
}
}
return str;
}
};