前言
字符串处理是 C++ 编程中的基础技能,而单词翻转则是考察字符操作逻辑的经典题目。这道题不仅要求理解输入输出的格式,还涉及多种反转策略的权衡。本文将通过三种不同的实现方式——手动遍历、双指针交换以及标准库函数,深入剖析其背后的思路与优劣。
题目描述
B2122 单词翻转
小明写单词时习惯反着写,例如 hello 写成 olleh。现在给定一个包含多个单词的句子,要求将每个单词复原,并按行输出。
输入格式
一行字符串,单词间以空格分隔。
输出格式
每个单词占一行。
样例
输入:
olleh dlrow
输出:
hello
world
方案一:手动遍历字符
这是最直观的思路。利用 cin >> s 的特性,它会自动按空格读取单词,我们只需对读入的字符串进行逆序输出即可。
代码实现
#include <iostream>
#include <string>
using namespace std;
int main() {
string 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>
#
std;
{
string str;
(cin >> str) {
left = ;
right = str.() - ;
(left < right) {
(str[left], str[right]);
left++;
right--;
}
cout << str << endl;
}
;
}


