将一个给定字符串 s
根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING"
行数为 3
时,排列如下:
P A H N A P L S I I G Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
算法思想讲解:
0 8
1 7 9
2 6 10
3 5 11
4 12
假设numRows=5,注意观察当n%(5*2-2)时,正好得出每个字符的行号,比如8%(5*2-2)=0;
9%(5*2-2)=1;或者是 7%(5*2-2)=8-1,也就是第一行。因此通过这种方法,我们可以分numRows次找出每行中的元素。
char * convert(char * s, int numRows){
int len = strlen(s);
if (numRows == 1) return s;
char *out = (char *)malloc((len + 1) * sizeof(char));
int t = 2 * numRows - 2;
int i = 0, j = 0, k = 0;//i分配每一行,j遍历原始整个字符串,k遍历新的整个字符串
for (i = 0; i < numRows; i++) {
for ( j = 0; j < len; j++) {
if (j%t == i || j % t == t - i) {
out[k++] = s[j];
}
}
}
out[k] = '\0';
return out;
}