https://leetcode-cn.com/problems/zigzag-conversion/
找规律,将Z字型分割,例如
这样就很容易看出来规律,先建numRows个字符串代表每一行的字符串
每一次我们只要知道第一行的应当插入的字符下标,自然就能知道下面多行的下标,而第一行前一个字符和后一个字符的下标的差值很容易看出来,就是2 x (numRows - 1),知道了第一行下一个应当插入的字符下标,反着往前推就能得到其他行应得的下标
知道了每次该插入的字符下标,每次判断下标是否在原字符串中即可
class Solution {
public:
string convert(string s, int numRows) {
if (numRows < 2) return s;
vector <string> a(numRows);
int p = 0, q = 0;
int n = s.length();
while (p < s.length()) {
q = p + 2*(numRows-1);
if (p < n) a[0] += s[p];
for (int i = 1; i < numRows - 1; i++) {
if (p + i < n) a[i] += s[p+i];
else break;
if (q - i < n) a[i] += s[q-i];
}
if (p + numRows - 1 < n) a[numRows-1] += s[p+numRows-1];
p = q;
}
string ans;
for (int i = 0; i < numRows; i++)
ans += a[i];
return ans;
}
};