6. ZigZag Conversion (字符串的连接)
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".
思路:Zigzag,一列长,一列短(少两个字符),长的那列由上到下写,短的由下到上写。
char* convert(char* s, int numRows) { int len = strlen(s); if(0 == len) return ""; char g[numRows][len+1]; //+1 for '\0' int p = 0; //pointer to s int i = 0; //line number int j[numRows]; //column number for(i = 0; i < numRows; i++){ j[i] = 0; } while(s[p]!='\0'){ for(i = 0; i < numRows; i++){ if(s[p]=='\0') break; g[i][j[i]++] = s[p++]; } for(i = numRows-2; i >= 1; i--){ if(s[p]=='\0') break; g[i][j[i]++] = s[p++]; } } g[0][j[0]] = '\0'; for(i = 1; i < numRows; i++){ g[i][j[i]] = '\0'; if(g[i][0]!='\0') strcat(g[0], g[i]); } //g[0] is saved in stack, which will be deleted when leave the function so we should copy it before leave char* ret = malloc(sizeof(char)*(len+1)); //saved in heap, which won't be disappeared when leave the function memcpy(ret, g[0], sizeof(char)*(len+1)); return ret; }