题目:
ac代码:
char * convert(char * s, int numRows){
if(numRows == 1)
return s;
int numCols = strlen(s)/(2*numRows-2)*(numRows-1);
if(strlen(s)%(2*numRows-2) != 0){
if(strlen(s)%(2*numRows-2) <= numRows)
numCols++;
else
numCols += strlen(s)%(2*numRows-2) - numRows + 1;
}
char res[numRows][numCols];
for(int ax = 0 ;ax <numRows;ax++)
for(int bx = 0;bx <numCols;bx++)
res[ax][bx] = ' ';
int index = 0;
for(int i = 0;i<numCols;i+=numRows-1){
for(int j = 0;j<numRows;j++){
if(index < (int)strlen(s))
res[j][i] = s[index++];
else
break;
}
index += numRows-2;
}
index = numRows;
for(int x = 1;x<numCols;x++){
for(int y = numRows-2;y>0;y--){
if(index < (int)strlen(s)&&x < numCols){
res[y][x] = s[index++];
x++;
}
else
break;
}
index += numRows;
}
char *result = (char*)malloc(((int)strlen(s)+1)*sizeof(char));
index = -1;
for(int a = 0 ;a <numRows;a++)
for(int b = 0;b<numCols;b++)
if(res[a][b]!=' ')
result[++index] = res[a][b];
result[++index] = '\0';
return result;
}
算法思想:根据题目要求先得到列数,再把Z字型想象成一个二维数组,进行对号入座。