1. 题目来源
链接:lc6. Z 字形变换
2. 题目解析
方法一:找规律
这不画图,能说的明白?
简单说一下:
- 纯找规律的一道问题,第一行与最后一行,等差数列,每个数相差
2n-2
。首项分别为 0 和n
。 - 中间行是两个等差数列混到一起,直线上的两数仍相差
2n-2
,处于斜线上的两数也是相差2n-2
,交织输出即可。直线上的首项即为0~n-1
,不包括最后一行。 斜线上的元素的起点为是2n-2-v
,v
表示该行第一列对应位置的数。 - 最后需要注意,如果
n=1
,那么公差变成 0,就死循环了。n=1
时直接返回即可。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
代码:
// 可看看lc 54 的一个螺旋矩阵
// 纯找规律的一道问题,第一行与最后一行,等差数列,每个数相差2n-2
// 中间行是两个等差数列混到一起,直线上的两数仍相差2n-2,处于斜线上的两数也是相差2n-2,交织输出即可
// 直线上元素的起点即为0--n-1
// 斜线上的元素的起点为是2n-2-v,v表示该行第一列对应位置的数
class Solution {
public:
string convert(string s, int n) {
string res;
// n==1时,2*n-2公差变为0,成为死循环,需要特判一下
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) res += 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()) res += s[j];
if (k < s.size()) res += s[k];
}
}
}
return res;
}
};
class Solution {
public:
string convert(string s, int n) {
string res;
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)
res += 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()) res += s[j];
if (k < s.size()) res += s[k];
}
}
}
return res;
}
};