【GESP】C++三级练习 luogu-B2122 单词翻转
GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。
luogu-B2122 单词翻转
题目要求
题目描述
小明同学写单词的时候喜欢反着写,比如
hello
他会写成olleh
。给出小明同学写的一个句子,请你将所有的单词复原。
输入格式
共一行,一个字符串表示句子,单词之间以空格分隔。
输出格式
每个单词一行。
输入输出样例 #1
输入 #1
1
olleh dlrow
输出 #1
1
2
hello
world
说明/提示
句子长度不超过 $100$,仅包含小写字母和空格,不存在多余的空格。
题目分析
解题思路
- 读取一整行输入的句子,句子中只包含小写字母和空格
- 遍历句子中的每个字符:
- 遇到字母时,将其加入当前单词
- 遇到空格时:
- 将当前单词翻转(将字母顺序颠倒)
- 输出翻转后的单词
- 清空当前单词,准备处理下一个单词
- 遍历结束后,需要处理最后一个单词:
- 将最后一个单词翻转
- 输出翻转后的单词
复杂度分析:
- 时间复杂度为 $O(n)$,其中n为输入句子的总长度
- 空间复杂度为 $O(w)$,其中w为单个单词的最大长度
示例代码
方法一:利用stringstream和reverse函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <iostream>
#include <sstream>
int main() {
// 定义字符串变量存储输入的句子
std::string str;
// 读取一整行输入
std::getline(std::cin, str);
// 创建字符串流,用于分割单词
std::stringstream ss(str);
// 定义字符串变量存储每个单词
std::string token;
// 使用getline按空格分割字符串流中的单词
while (std::getline(ss, token, ' ')) {
// 将每个单词翻转
reverse(token.begin(), token.end());
// 输出翻转后的单词
std::cout << token << std::endl;
}
return 0;
}
方法二:手动便利处理字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <string>
#include <iostream>
int main() {
// 定义字符串变量存储输入的句子
std::string str;
// 读取一整行输入
std::getline(std::cin, str);
// 定义字符串变量存储当前处理的单词
std::string cur_str;
// 遍历输入的字符串
for (int i = 0; i < str.length(); i++) {
// 如果遇到空格,说明一个单词处理完成
if (str[i] == ' ') {
// 输出当前已翻转的单词
std::cout << cur_str << std::endl;
// 清空当前单词,准备处理下一个
cur_str = "";
} else {
// 将当前字符添加到单词前面,实现翻转效果
cur_str = str[i] + cur_str;
}
}
// 输出最后一个单词(因为最后一个单词后面没有空格)
std::cout << cur_str << std::endl;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权