C解法
本代码实现了将输入的字符串按照 "之"字形排列 的功能,并将每一行内容输出。之字形排列的核心在于字符的行号的变化规则:
从第一行开始,按顺序将字符分配到每一行,直到最后一行。
到达最后一行后,开始逆序向上排列,直到回到第一行。
重复上述过程,直到字符串排列完毕。
具体步骤
动态分配二维数组:
创建一个大小为
𝑛
n 的字符指针数组,每个指针指向一行字符。
每行分配内存,大小为字符串长度
strlen(str)
strlen(str)。
初始化每行为空字符串,用于后续拼接字符。
字符分配规则:
使用变量 reverse 控制方向:
reverse = 1 表示从下向上。
reverse = 0 表示从上向下。
计算当前字符应该插入的行号 k,将字符追加到对应行的字符串末尾。
打印与内存释放:
遍历二维数组,逐行打印已分配的字符串。
打印完成后释放每行的内存以及整个数组。
#include
#include
#include
void getResult(char *str, int n) {
char **matrix = (char **)malloc(n * sizeof(char *));
for (int i = 0; i < n; i++) {
matrix[i] = (char *)malloc(strlen(str) + 1);
matrix[i][0] = '\0';
}
int reverse = 1;
for (int i = 0; i < strlen(str); i++) {
int k = i % n;
if (k == 0) reverse = !reverse;
if (reverse) k = n - 1 - k;
int len = strlen(matrix[k]);
if (len < strlen(str)) {
matrix[k][len] = str[i];
matrix[k][len + 1] = '\0';
}
}
for (int i = 0; i < n; i++) {
printf("%s\n", matrix[i]);
free(matrix[i]);
}
free(matrix);
}
int main() {
char str[100];
int n;
scanf("%s", str);
scanf("%d", &n);
if (n <= 0) {
printf("Invalid input for n.\n");
return 1;
}
getResult(str, n);
return 0;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
评论记录:
回复评论: