反转字符串里的单词(leetcode 4.10每日打卡)

给定一个字符串,逐个翻转字符串中的每个单词。
 
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

 
说明:

 无空格字符构成一个单词。
 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
 
思路:先去除首尾以及内含的空格,然后用word数组来记录每个单词,然后分别倒序输入到s中。
学习:网上oj因为不是一个测试样例执行一次总程序,所以全局变量应该执行一次清空一次。
 1 char dealS[10000] = { 0 };
 2 char word[10000] = { 0 };
 3 
 4 char* reverseWords(char* s)
 5 {
 6     int temBegin;
 7     int temEnd;
 8     int k = -1,l = -1;
 9     int len = strlen(s);
10     memset()
11     for (temBegin = 0; temBegin < strlen(s); temBegin++)  //删除开头的空格
12     {
13         if (s[temBegin] != ' ')
14             break;
15     }
16 
17     for (temEnd = strlen(s) - 1; temEnd >= 0; temEnd--)  //删除结尾的空格
18     {
19         if (s[temEnd] != ' ')
20             break;
21     }
22     for (int i = temBegin; i < temEnd + 1; i++)//删除中途的空格
23     {
24         if (s[i] != ' ')
25         {
26             dealS[++k] = s[i];
27         }
28         else if (s[i] == ' ')
29         {
30             if (s[i + 1] == ' ')  //连续空格情况
31                 continue;
32             else
33                 dealS[++k] = ' ';
34         }
35     }
36     
37     k = -1;
38     memset(s, 0, len);  //清空s
39     for (int i = strlen(dealS)-1; i >= 0; i--)
40     {
41         while (dealS[i] != ' ' && i != -1)
42         {
43             word[++l] = dealS[i];
44             i--;
45         }
46         
47         for (int j = l; j >= 0; j--)
48         {
49             s[++k] = word[j];
50         }
51         if (i != 0)  //如果不是最后
52         {
53             s[++k] = ' ';
54         }
55         memset(word, 0, l + 1); //清空word
56         l = -1;
57     }
58     s[k] = '\0';
59     return s;
60 }
 

 
 

猜你喜欢

转载自www.cnblogs.com/ZhengLijie/p/12672521.html