题目描述
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
题解
观察法。通过对数组下标的观察找到规律。我们观察Z字形的一个转折。
0 2n-2
1 2n-3
2 2n-4
. .
. .
. n
n-1
可以看出,对于第i行,我们读取的两个数是第i和第2n-2-i个数。剩下的每一个转折都是周期性的重复这个过程。找到了这样的规律之后,代码如下
char * convert(char * s, int numRows) {
int len = strlen(s);
if (numRows <= 1) return s;
int numSize = 0;
char * ans = (char*)malloc(sizeof(char) * (len+1));
int n = 2 * numRows - 2;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < len; j++) {
int k = j % n;
if (k == i || k == n - i) {
ans[numSize++] = s[j];
}
}
}
ans[numSize] = '\0';
return ans;
}