思路:
- 定义numRows个字符数组,用于存每一行的字符;再定义一个标志行数的变量cnt,cnt在0到numRows-1之间不停的加一或减一(当cnt到0了,则开始+1,当cnt到numRows-1了,则开始-1)
- 遍历输入字符串,将每个字符填写到相应的字符数组里去
- 最后将这numRows个字符数组拼接到一起
注意:
- 可以再定义numRows个整数数组,用于存储每个字符数组当前的下标
- 注意边界情况的考虑
代码:
char* convert(char* s, int numRows) {
if (numRows == 1) return s;
int len = strlen(s);
if (len <= numRows) return s;
char **rows = (char**)malloc(numRows*sizeof(char*));
for (int i = 0; i < numRows; i++) {
rows[i] = (char*)malloc(len*sizeof(char));
memset(rows[i], 0, len*sizeof(char));
}
int row_index[numRows]; // 记录每一行的长度
memset(row_index, 0, sizeof(row_index));
int flag = 1;
int cnt = 0;
for (int i = 0; i < len; i++) {
rows[cnt][row_index[cnt]++] = s[i];
cnt += flag;
if (cnt == 0 || cnt == numRows-1) {
flag *= -1;
}
}
char *res = (char*)malloc(len+1);
int index = 0;
for(int i = 0; i < numRows; i++) {
for(int j = 0; j < row_index[i]; j++) {
res[index++] = rows[i][j];
}
}
res[index] = '\0';
free(rows);
return res;
}