版权声明:转载请联系博主 https://blog.csdn.net/zxtalentwolf/article/details/79008601
原始超时版本
char* convert(char* s, int numRows) {
if(numRows<=1 || numRows>=strlen(s)) return s;
int slen=strlen(s);
int rowlen=slen;
char t[1000*1000];
//char *t = malloc(sizeof(char) * (numRows * rowlen));
for(int i=0; i < 1000 * 1000; i++) t[i]=-1;
// memset(t,1000*1000,-1);
int row,col,step;
row=col=step=0;
for(int i=0; i < strlen(s); i++){
*(t+rowlen*row+col)=s[i];
if(row == 0) step=1;
else if(row == numRows-1) step=-1;
row+=step;
if(step == -1) col++;
}
char *res=malloc(sizeof(char) * (slen+1));
int p=0;
for(int i=0;i < numRows ; i++)
for(int j=0;j < slen; j++){
if(t[i*slen+j]!=-1) res[p++]=t[i*slen+j];
}
// free(t);
res[p]='\0';
return res;
}
上面的这个程序因为要初始化数组的原因很容易超时,于是经过研究,使用下面的算法更加优秀
char* convert(char* s, int numRows) {
if(numRows<=1 || numRows>=strlen(s)) return s;
int k=0,n=strlen(s);
char * res=malloc(sizeof(char)*(n+1));
for(int i=0;i < numRows; i++){
for(int j=i;j<n;j+=2*(numRows-1)){
res[k++]=s[j];
if(i!=0 && i!=numRows-1){
int t=j+2*(numRows-1)-2*i;
if(t<n)
res[k++]=s[t];
}
}
}
res[k]='\0';
return res;
}
这里应当注意strlen求取的是字符串的不含'\0'的字符长度,所以动态分配字符空间时要注意加一