题目描述
将一句话的单词进行倒置,标点不倒置。
比如 I like beijing. 经过函数后变为:beijing. like I
输入描述: 每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100 输出描述: 依次输出倒置之后的字符串,以空格分割
示例
输入: I like beijing.
输出: beijing. like I
解题思路及完整代码
思路一 :先整体再局部
先将整个字符串逆置过来,再遍历字符串,找出每个单词,对单词逆置。这里我们使用了stl算法中的 reverse,所以这里使用迭代器遍历string
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s;
getline(cin, s);
reverse(s.begin(), s.end());
string::iterator start = s.begin();
while (start != s.end())
{
string::iterator end = start;
while (end!=s.end()&&*end != ' ')
end++;
reverse(start, end);
if (end != s.end())
start = end + 1;
else
start = end;
}
cout << s << endl;
system("pause");
return 0;
}
思路二: :通过cin 将单词逆向连接
第二思路是一个比较讨巧的思路,直接利用cin>>s接收输入,遇到空格就结束了,自然就分割开了每个单 词,其次将每次接收到的单词拼接到之前串的前面就逆置过来了
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
cin >> s2;
// cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出
while (cin >> s1)
s2 = s1 + " " + s2;
cout << s2;
system("pause");
return 0;
}
思路三 :改变单词连接顺序
将字符串分割成单词存在vector中,重新改变输出顺序。
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
#include <vector>
int main()
{
string s;
getline(cin, s);
vector<string> v;
int start = 0;
int pos = 0;
do
{
pos = s.find(' ', start);
string s1 = s.substr(start, pos - start);
v.push_back(s1);
start = pos + 1;
} while (pos < s.size());
for (int i = v.size() - 1; i >= 0; --i)
cout << v[i]<<" ";
//vector<string>::reverse_iterator it = v.rbegin();
//while (it != v.rend())
//{
// cout << *it << " ";
// ++it;
//}
//cout << endl;
system("pause");
return 0;
}