转自:http://www.cppblog.com/humanchao/archive/2008/09/12/61708.html
将字符串里词顺序倒置,如"Times New Roman"变为"Roman New Times"。以空格为分隔符。
解决方案为:先将整个字串倒置,然后依次把倒置后串中的每一个单词倒置。
这个问题解答的思路很简单,但是要考虑到很多种的情况,比如字符串的头、尾有多余的空格怎么办,如果字符串中只有空格,还有字符串中间可能会有两个以上并列的空格。
程序如下:
1 void ReverseStr(char *pStr, int len)
2 {
3 assert(pStr);
4
5 char ch;
6 for (int i = 0; i < len/2 ; i++)
7 {
8 ch = pStr[i];
9 pStr[i] = pStr[len-1-i];
10 pStr[len-1-i] = ch;
11 }
12 }
13
14 void ReverseStrWord(char *pStr, int len)
15 {
16 assert(pStr);
17
18 if (len <= 1)
19 return;
20
21 // 倒置整个字符串
22 ReverseStr(pStr, len);
23
24 // 处理头多余的空格
25 int i = 0;
26 if (pStr[0] == ' ') while (pStr[i] == ' ' && i < len) i++;
27
28 // 整个串都是空格
29 if (i == len)
30 return;
31
32 // 处理尾多余的空格
33 if (pStr[len - 1] == ' ') while (pStr[len - 1] == ' ' && len - 1 > 0) len--;
34
35 for (int start = i; i < len; i++)
36 {
37 // 最后的end要+1
38 if (i == len-1)
39 {
40 ReverseStr(pStr+start, i-start+1);
41 break;
42 }
43
44 // 倒置一个单词
45 if (pStr[i] == ' ')
46 {
47 ReverseStr(pStr+start, i-start);
48 start = i+1;
49 // 处理内部并列的空格
50 if (pStr[start] == ' ')
51 {
52 while(pStr[start] == ' ') {i++;start++;};
53 }
54 }
55 }
56 }
57
posted on 2012-04-09 13:47
王海光 阅读(387)
评论(0) 编辑 收藏 引用 所属分类:
算法