C++ 实战:B2122 单词翻转解题思路与代码优化
在字符串处理的基础练习中,如何高效地反转单词是一个经典场景。本题要求将输入句子中的每个单词字符顺序颠倒,并按行输出。这不仅是考察 string 类的基本操作,也是理解不同算法策略的好机会。
题目描述
输入格式 共一行,一个字符串表示句子,单词之间以空格分隔。
输出格式 每个单词一行。
样例 #1
- 输入
olleh dlrow
- 输出
hello world
方案一:手动逆序遍历
最直观的思路是读取到一个单词后,从最后一个字符开始向前遍历并输出。这种方式不需要修改原字符串,逻辑非常直接。
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
// cin >> s 会自动跳过前导空格并以空格为界读取单词
while (cin >> s) {
for (int i = s.size() - 1; i >= 0; i--) {
cout << s[i];
}
cout << endl;
}
return 0;
}
解析
这里利用了 cin 的流提取特性,它天然按空白符分割单词。循环从下标末尾倒着走,逐个打印字符。虽然简单,但每次都要重新计算索引,且没有利用标准库的现成工具。
方案二:双指针原地交换
如果希望原地修改字符串内容(例如后续还需要使用反转后的字符串),可以使用双指针法。这种方法在内存操作上更紧凑。
#include <iostream>
#include <string>
using namespace std;
int {
string str;
(cin >> str) {
left = ;
right = str.() - ;
(left < right) {
(str[left], str[right]);
left++;
right--;
}
cout << str << endl;
}
;
}


