1451. 重新排列句子中的单词
解题思路:
1、暴力统计单词个数和长度,使用strcpy到结构体字符串中,结果超时;
2、改变思路,第一遍遍历数组,获取单词个数、起始位置和单词长度,存放在结构体中;
3、对结构体进2次排序,标准做法,第一次排长度,第二次排起始位置;
4、第二次遍历结构体数组,赋值给结果res中;
详细代码如下:
1 typedef struct NODE { 2 int len; 3 int pos; 4 } Node; 5 int cmp(const void *_a, const void *_b) { 6 Node a = *(Node*)_a; 7 Node b = *(Node*)_b; 8 if(a.len == b.len) { 9 return a.pos - b.pos; 10 } 11 return a.len - b.len; 12 } 13 char * arrangeWords(char * text){ 14 int len = strlen(text); 15 Node *list = malloc(len *sizeof(Node)); 16 memset(list, 0, len * sizeof(Node)); 17 char *res = malloc(len+1); 18 memset(res, 0, len+1); 19 if(!text) { 20 return ""; 21 } 22 text[0] = tolower(text[0]); 23 int i = 0; 24 char *tmp = strtok(text, " "); 25 while(tmp != NULL) { 26 list[i].len = strlen(tmp); 27 list[i].pos = tmp - text; //获取当前位置 28 i++; 29 tmp = strtok(NULL, " "); 30 } 31 qsort(list, i, sizeof(list[0]), cmp); 32 int cnt = i; 33 i = 0; 34 char *p = res; 35 for(i = 0;i<cnt;i++) { 36 strncpy(p, &text[list[i].pos], list[i].len); 37 p +=list[i].len; 38 if(i!=cnt-1) { 39 *p = ' '; 40 p++; 41 } 42 } 43 res[0] = toupper(res[0]); 44 return res; 45 }