- c++/stl/string
倒置字符串
题目链接:倒置字符串__牛客网 (nowcoder.com)
题目描述:
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
依次输出倒置之后的字符串,以空格分割
输入:
I like beijing.
输出:
beijing. like I

🔓解法一【下标访问】
📖流程描述:
- 整体逆置
reverse(s.begin(), s.end());
- 部分逆置
end遇到’ ‘时,逆置(s.begin()+begin,s.begin()+end)
begin到end的下一位,++end继续遍历,直到s[end] 为0退出循环,完成逆置;
注意:最后一个位置为’\0’时不会逆置,需要在出循环时对最后一个单词逆置
⌨️代码实现:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s;
int begin = 0, end = 0;
getline(cin, s);
// 1. 整体逆置
reverse(s.begin(), s.end());
// 2. 部分逆置
while (s[end])
{
// 2.1 end位置==' '时交换
if (s[end] == ' ')
{
reverse(s.begin() + begin, s.begin() + end);
begin = end + 1;
}
++end;
}
// 3. 处理最后一个单词
reverse(s.begin() + begin, s.begin() + end);
cout << s << endl;
return 0;
}
💡解法二【迭代器访问】
📖流程描述:
流程同上,换为迭代器访问更直观简洁
⌨️代码实现:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s;
getline(cin, s);
auto start = s.begin(), end = s.begin();
//1. 整体逆置
reverse(s.begin(), s.end());
//2. 部分逆置
while (end != s.end())
{
if (*end == ' ')
{
reverse(start, end);
start = end + 1;
}
++end;
}
// 3. 处理最后一个单词
reverse(start, end);
cout << s << endl;
return 0;
}
运行结果:
