1- char * convert (char * s , int numRows ) {
2- if (numRows == 1 || numRows >= strlen (s )) {
3- char * result = malloc (strlen (s ) + 1 );
4- strcpy (result , s );
5- return result ;
6- }
7- char * * rows = malloc (numRows * sizeof (char * ));
8- for (int i = 0 ; i < numRows ; i ++ ) {
9- rows [i ] = malloc (strlen (s ) + 1 );
10- rows [i ][0 ] = '\0' ;
11- }
12- int currentRow = 0 ;
13- int goingDown = 0 ;
14- for (int i = 0 ; s [i ] != '\0' ; i ++ ) {
15- strncat (rows [currentRow ], & s [i ], 1 );
16- if (currentRow == 0 || currentRow == numRows - 1 ) {
17- goingDown = !goingDown ;
1+ char * convert (char * s , int numRows ) {
2+ if (numRows == 1 ) {
3+ return strdup (s );
184 }
19- currentRow += goingDown ? 1 : -1 ;
20- }
21- char * result = malloc (strlen (s ) + 1 );
22- result [0 ] = '\0' ;
23- for (int i = 0 ; i < numRows ; i ++ ) {
24- strcat (result , rows [i ]);
25- free (rows [i ]);
26- }
27- free (rows );
28- return result ;
29- }
5+
6+ int len = strlen (s );
7+ char * * g = (char * * ) malloc (numRows * sizeof (char * ));
8+ int * idx = (int * ) malloc (numRows * sizeof (int ));
9+ for (int i = 0 ; i < numRows ; ++ i ) {
10+ g [i ] = (char * ) malloc ((len + 1 ) * sizeof (char ));
11+ idx [i ] = 0 ;
12+ }
13+
14+ int i = 0 , k = -1 ;
15+ for (int p = 0 ; p < len ; ++ p ) {
16+ g [i ][idx [i ]++ ] = s [p ];
17+ if (i == 0 || i == numRows - 1 ) {
18+ k = - k ;
19+ }
20+ i += k ;
21+ }
22+
23+ char * ans = (char * ) malloc ((len + 1 ) * sizeof (char ));
24+ int pos = 0 ;
25+ for (int r = 0 ; r < numRows ; ++ r ) {
26+ for (int j = 0 ; j < idx [r ]; ++ j ) {
27+ ans [pos ++ ] = g [r ][j ];
28+ }
29+ free (g [r ]);
30+ }
31+ ans [pos ] = '\0' ;
32+
33+ free (g );
34+ free (idx );
35+ return ans ;
36+ }
0 commit comments