题目
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
示例:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
解题思路
分割区域,找到特定列的规律。
解答
char* convert(char* s, int numRows) {
if(numRows == 1)
return s;
int slen = strlen(s);
char *out = (char*)malloc(sizeof(char)*(slen + 1));
int i, j, x = 0;
for(i = 0; i < numRows; i++)
{
for(j = 0; (j * (2 * numRows -2))+ i < slen; j++)
{
out[x++] = s[j * (2 * numRows -2) + i];
if(i != 0 && i != numRows - 1 && (j + 1)*(2 * numRows -2) - i < slen)
out[x++] = s[(j + 1)*(2 * numRows -2) - i];
}
}
out[slen] = '\0';
return out;
}
示意图
如图所示,绿框中的元素满足
j * (2 * numRows -2) + i
的对应关系,红框中的元素是通过同一行中绿框的元素推导出来的,满足(j + 1)*(2 * numRows -2) - i
。
网友评论