luogu-B2122 单词翻转

luogu-B2122 单词翻转

GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。

luogu-B2122 单词翻转

题目要求

题目描述

小明同学写单词的时候喜欢反着写,比如 hello 他会写成 olleh。给出小明同学写的一个句子,请你将所有的单词复原。

输入格式

共一行,一个字符串表示句子,单词之间以空格分隔。

输出格式

每个单词一行。

输入输出样例 #1

输入 #1

olleh dlrow

输出 #1

hello
world

说明/提示

句子长度不超过 100100,仅包含小写字母和空格,不存在多余的空格。


题目分析

解题思路

  1. 读取一整行输入的句子,句子中只包含小写字母和空格
  2. 遍历句子中的每个字符:
    • 遇到字母时,将其加入当前单词
    • 遇到空格时:
      • 将当前单词翻转(将字母顺序颠倒)
      • 输出翻转后的单词
      • 清空当前单词,准备处理下一个单词
  3. 遍历结束后,需要处理最后一个单词:
    • 将最后一个单词翻转
    • 输出翻转后的单词

复杂度分析:

  • 时间复杂度为 O(n)O(n),其中n为输入句子的总长度
  • 空间复杂度为 O(w)O(w),其中w为单个单词的最大长度

{% include custom/custom-post-content-inner.html %}


示例代码

方法一:利用stringstream和reverse函数

#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;
}

方法二:手动便利处理字符串

#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;
}

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on