跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 实战:B2122 单词翻转解题思路与代码优化

本文针对 B2122 单词翻转问题展示了三种 C++ 解决方案。第一种通过手动逆序遍历字符输出,逻辑直观但略显冗余;第二种采用双指针交换字符串内部字符,效率更高且原地修改;第三种利用 STL 的 reverse 函数,代码最简洁。对比发现,标准库函数在可读性和维护性上优势明显,适合生产环境,而手写算法有助于理解底层原理。实际开发中建议优先使用成熟工具,同时掌握基础算法以应对面试或特定场景。

暗影行者发布于 2026/3/28更新于 2026/9/1047 浏览
C++ 实战:B2122 单词翻转解题思路与代码优化

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;

{
    string str;
     (cin >> str) {
         left = ;
         right = str.() - ;
        
         (left < right) {
            (str[left], str[right]);
            left++;
            right--;
        }
        cout << str << endl;
    }
     ;
}
int main()
while
int
0
int
size
1
// 当左指针小于右指针时,交换两端字符并向中间靠拢
while
swap
return
0

解析 通过 left 和 right 两个指针分别指向字符串首尾,交换它们指向的字符后向中间移动。直到两指针相遇或交错,整个字符串即完成反转。相比方案一,这种方式保留了完整的字符串对象,适合需要复用数据的场景。

方案三:使用 STL reverse 函数

C++ 标准模板库(STL)提供了强大的算法组件,其中 std::reverse 专门用于反转序列。这是工业级开发中最推荐的方式。

#include <iostream>
#include <string>
#include <algorithm> // 必须包含此头文件

using namespace std;

int main() {
    string str;
    while (cin >> str) {
        reverse(str.begin(), str.end());
        cout << str << endl;
    }
    return 0;
}

解析 reverse 接受迭代器范围作为参数。str.begin() 和 str.end() 定义了要操作的区间。编译器通常会针对这个函数进行高度优化,执行效率往往优于手写循环,且代码可读性极高。引入 <algorithm> 头文件是关键,很多初学者容易遗漏这一点导致编译错误。

对比与总结

方案优点缺点
手动遍历无需额外头文件,逻辑极简无法复用字符串,需多次访问内存
双指针原地修改,空间复杂度 O(1)代码量稍多,易写错边界
STL reverse语义清晰,性能优,维护成本低需包含 <algorithm>

在实际工程中,除非有特殊的底层限制,否则应优先选择 std::reverse。它不仅减少了出错概率,也让代码意图一目了然。对于初学者而言,理解双指针原理有助于深入掌握指针与内存管理,建议两种写法都尝试实现一遍。

拓展思考

如果题目要求保留空格位置仅反转单词内部字符,或者处理标点符号,上述方法就需要调整。例如可以先用正则表达式分割单词,再对每个片段应用反转逻辑。这类变体更能锻炼对字符串边界的把控能力。

目录

  1. C++ 实战:B2122 单词翻转解题思路与代码优化
  2. 题目描述
  3. 方案一:手动逆序遍历
  4. 方案二:双指针原地交换
  5. 方案三:使用 STL reverse 函数
  6. 对比与总结
  7. 拓展思考

更多推荐文章

查看全部
  • 学生与教育工作者免费获取 GitHub Copilot 权限指南
  • Kotlin 结合属性动画实现糖果捕捉游戏
  • C++ 面试核心知识点总结:语法、内存与 STL
  • OpenClaw AI 助手框架搭建与配置指南
  • OpenClaw 飞书机器人搭建指南
  • 基于 cpolar 内网穿透远程访问 Open-Lovable 网页克隆工具
  • 利用 AI 视觉模型优化 Unity 编辑器插件:从功能实现到界面美化
  • 自进化医疗智能体:动态记忆与持续运行架构(Python 版 下)
  • Stable Diffusion WebUI 本地部署全步骤(含 CUDA 及 PyTorch 安装)
  • 前缀和算法详解:从一维到二维的实战应用
  • 未来 AI 操作系统(八):灵知之门与存在智能
  • 利用浏览器插件 Web Scraper 爬取知乎评论数据
  • Photoshop 集成 ComfyUI 工作流配置指南
  • AI 辅助生成万字长篇小说工具使用指南
  • sherpa-onnx 离线语音部署框架:支持 Whisper、Moonshine 等多模型跨平台
  • OpenClaw 跨平台 AI 助手完全使用指南:从安装到高级配置
  • 从零开始手写 LLM 模型架构与实现
  • OpenClaw 安装配置与多平台接入实战
  • OpenCode 安装 oh-my-opencode 插件教程:AI 辅助自动安装
  • 构建离线私有 GPT:实现本地大模型与文档问答

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online