例如輸入“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 }
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 }