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 }

 

posted @ 2020-12-24 19:34  cn风  阅读(116)  评论(0)    收藏  举报