题目地址:
https://leetcode.com/problems/zigzag-conversion/
给定一个字符串
s
s
s,再给定一个正整数
k
k
k,例如"PAYPALISHIRING"
,
k
=
3
k=3
k=3,那么将其变为:
P A H N
A P L S I I G
Y I R
接着就要返回"PAHNAPLSIIGYIR"
。按照这样的规则变换字符串。
我们观察,第一行和最后一行的字母下标是起点为 0 , k − 1 0,k-1 0,k−1,公差为 2 k − 2 2k-2 2k−2的等差数列,其余行则是起点为 i , 2 k − 2 − i i,2k-2-i i,2k−2−i,公差为 2 k − 2 2k-2 2k−2的两个等差数列轮流输出。需要注意 k = 1 k=1 k=1的例外情况。代码如下:
class Solution {
public:
string convert(string s, int nr) {
if (nr == 1) return s;
int n = s.size();
string res;
for (int i = 0; i < nr; i++)
if (!i || i == nr - 1)
for (int j = i; j < n; j += 2 * nr - 2) res += s[j];
else
for (int j1 = i, j2 = 2 * nr - 2 - i; j1 < n || j2 < n;
j1 += 2 * nr - 2, j2 += 2 * nr - 2) {
if (j1 < n) res += s[j1];
if (j2 < n) res += s[j2];
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。