单词翻转(信息学奥赛一本通1144)
题目来源
信息学奥赛一本通(C++版)在线评测系统
题目描述
1144:单词翻转
时间限制: 1000 ms 内存限制: 65536 KB
提交数:60098 通过数: 26099【题目描述】
输入一个句子(一行),将句子中的每一个单词翻转后输出。
【输入】
只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。
【输出】
翻转每一个单词后的字符串,单词之间的空格需与原文一致。
【输入样例】
hello world
【输出样例】
olleh dlrow
题目限制
一次遍历解题
思路分析
解题思路
输入处理:
- 首先,我们需要读取输入的句子,将其存储在一个字符串中。由于句子中可能包含空格,我们可以使用
getline
函数来读取整行输入。单词分割与翻转:
- 遍历输入的字符串,通过空格来识别每个单词的边界。
- 对于每个单词,我们可以使用双指针法进行翻转。具体来说,我们设置两个指针,一个指向单词的起始位置,另一个指向单词的结束位置,然后交换这两个指针所指向的字符,并将指针向中间移动,直到两个指针相遇。
输出结果:
- 完成所有单词的翻转后,将处理后的字符串输出。
具体代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
int left = 0, right = 0;
string str; getline(cin, str);
for (int i = 0; i <= str.size(); i++)
{
if (str[i] == ' ' || i == str.size())
{
right--;
while (left < right)
{
swap(str[left++], str[right--]);
}
left = i + 1;
right = i + 1;
}
else right++;
}
cout << str;
}
代码功能概述
这段代码的主要功能是对输入的一行字符串中的每个单词进行反转,同时保持单词在字符串中的顺序不变。例如,输入 "hello world"
,输出将是 "olleh dlrow"
。
代码逻辑详细解释
-
变量初始化:
left
和right
初始化为 0,它们将用于标记每个单词的起始和结束位置。str
是用于存储用户输入的字符串,通过getline(cin, str)
从标准输入读取一行字符串。
-
遍历字符串:
- 使用
for
循环遍历字符串,循环变量i
从 0 到str.size()
(注意这里包含了str.size()
这个边界,用于处理最后一个单词)。 - 当遇到空格(
str[i] == ' '
)或者到达字符串末尾(i == str.size()
)时,说明一个单词结束。此时,right
减 1(因为之前right
多走了一步),然后进入while
循环,该循环用于反转当前单词。在while
循环中,使用swap
函数交换left
和right
位置的字符,并将left
递增,right
递减,直到left
不小于right
,完成单词的反转。 - 反转完成后,更新
left
和right
的值为i + 1
,即指向下一个单词的起始位置。 - 如果当前字符不是空格,
right
加 1,继续扩展当前单词的范围。
- 使用
-
输出结果:
- 遍历结束后,所有单词都已反转,通过
cout << str;
输出处理后的字符串。
- 遍历结束后,所有单词都已反转,通过