posts - 183,  comments - 10,  trackbacks - 0
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

这个问题在多处曾出现过。大体思路是两次翻转,即先翻转各个单词,然后将整个句子翻转。也可将两个翻转顺序颠倒过来,先翻转句子,在翻转单词。
一种无意义的做法是,先把句子中的每个单词存放在一个 vector<string> 中,然后反向遍历输出。

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 void reverseStr(string& s, string::size_type left, string::size_type right)
 6 {
 7     while (left < right)
 8     {        
 9         swap(s[left++], s[right--]);
10     }
11 }
12 
13 string getReverse(const string& s)
14 {
15     if (s.empty())
16     {
17         return string("");
18     }
19     string ret = s;
20     string::size_type left, right;
21     left = s.find_first_not_of(' '0);
22     right = s.find_first_of(' ', left);
23     while (right != string::npos)
24     {
25         reverseStr(ret, left, right - 1);
26         left = s.find_first_not_of(' ', right);
27         right = s.find_first_of(' ', left);
28     }
29     if (left != string::npos)
30     {
31         reverseStr(ret, left, ret.size() - 1);
32     }
33     reverseStr(ret, 0, ret.size() - 1);
34     return ret;
35 }
36 
37 int main()
38 {
39     string s;
40     while (getline(cin, s))
41     {
42         cout << getReverse(s) << endl;
43     }
44     return 0;
45 }
posted on 2011-04-23 19:26 unixfy 阅读(1252) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理