C++中反转字符串单词字符顺序的两种方法

 更新时间:2026年03月16日 09:49:07   作者:likuolei  
本文介绍了C++中反转字符串中每个单词字符顺序的两种方法:方法一使用字符串流按单词拆分并反转,方法二使用双指针原地反转,两种方法各有优缺点,适合不同的场景,需要的朋友可以参考下

在 C++ 中,字符串处理是常见的面试与算法练习题。本题目标是:反转字符串中每个单词的字符顺序,但保持单词顺序不变。

示例:

输入:  "Hello World"
输出:  "olleH dlroW"

也就是说:

Hello → olleH
World → dlroW

下面介绍 两种经典实现方法

一、方法一:使用字符串流(stringstream)

利用 将字符串按单词拆分,然后逐个反转。

思路

  1. 使用 stringstream 按空格分割单词
  2. 使用 reverse() 反转单词
  3. 拼接结果字符串

代码实现

#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
string reverseWords(string s) {
    stringstream ss(s);
    string word;
    string result;
    while (ss >> word) {
        reverse(word.begin(), word.end());
        result += word + " ";
    }
    result.pop_back();
    return result;
}
int main() {
    string str = "Hello World";
    cout << reverseWords(str) << endl;
    return 0;
}

输出:

olleH dlroW

时间复杂度

O(n)

空间复杂度:

O(n)

优点:

  • 代码简单
  • 可读性好

缺点:

  • 使用额外空间

二、方法二:双指针原地反转

使用 双指针扫描字符串,找到每个单词的范围并进行反转。

思路

  1. 遍历字符串
  2. 找到单词起始位置
  3. 找到单词结束位置
  4. 调用 reverse() 反转

代码实现

#include <iostream>
#include <algorithm>

using namespace std;

string reverseWords(string s) {

    int start = 0;

    for (int i = 0; i <= s.size(); i++) {

        if (i == s.size() || s[i] == ' ') {

            reverse(s.begin() + start, s.begin() + i);

            start = i + 1;
        }
    }

    return s;
}

int main() {

    string str = "Hello World";

    cout << reverseWords(str) << endl;

    return 0;
}

输出:

olleH dlroW

时间复杂度

O(n)

空间复杂度:

O(1)

优点:

  • 原地操作
  • 更节省内存

缺点:

  • 实现稍复杂

三、两种方法对比

方法思路空间复杂度适合场景
stringstream拆分单词再反转O(n)简单实现
双指针原地扫描O(1)面试优化

四、进阶问题(面试常问)

很多面试会继续延伸:

1 反转单词顺序

例如:

"Hello World"
→ "World Hello"

2 去除多余空格

例如:

"  hello   world "
→ "world hello"

3 整个字符串反转 + 单词反转

经典算法:

1 先整体反转
2 再逐个单词反转

该题在很多算法平台都有类似题目,例如:

  • LeetCode

五、总结

反转字符串中单词字符顺序的核心方法:

1️⃣ 使用 字符串流分割单词
2️⃣ 使用 双指针原地反转

关键函数:

reverse()

以上就是C++中反转字符串单词字符顺序的两种方法的详细内容,更多关于C++反转字符串单词字符顺序的资料请关注脚本之家其它相关文章!

相关文章

  • 详解C语言之实现通讯录

    详解C语言之实现通讯录

    这篇文章主要为大家详细介绍了用C语言实现通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 用pybind11封装C++实现的函数库的方法示例

    用pybind11封装C++实现的函数库的方法示例

    这篇文章主要介绍了用pybind11封装C++实现的函数库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 详解桶排序算法的思路及C++编程中的代码实现

    详解桶排序算法的思路及C++编程中的代码实现

    桶排序即是先把每个桶中的元素进行排序然后遍历桶依次列出元素的算法,桶排序在元素较少的情况下很高效,以下我们就来详解桶排序算法的思路及C++编程中的代码实现:
    2016-07-07
  • C语言如何输出中文

    C语言如何输出中文

    这篇文章主要介绍了C语言如何输出中文问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • C语言结构体成员赋值的深拷贝与浅拷贝详解

    C语言结构体成员赋值的深拷贝与浅拷贝详解

    C语言中的浅拷贝是指在拷贝过程中,对于指针型成员变量只拷贝指针本身,而不拷贝指针所指向的目标,它按字节复制的。深拷贝除了拷贝其成员本身的值之外,还拷贝成员指向的动态内存区域内容。本文将通过示例和大家详细说说C语言的深拷贝与浅拷贝,希望对你有所帮助
    2022-09-09
  • 树存储结构的几种表示方法

    树存储结构的几种表示方法

    今天小编就为大家分享一篇关于树存储结构的几种表示方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • C++课程设计之学生成绩管理系统

    C++课程设计之学生成绩管理系统

    这篇文章主要为大家详细介绍了C++课程设计之学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 详解VS2019使用scanf()函数报错的解决方法

    详解VS2019使用scanf()函数报错的解决方法

    本文主要介绍了详解VS2019使用scanf()函数报错的解决方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C++实现的归并排序算法详解

    C++实现的归并排序算法详解

    这篇文章主要介绍了C++实现的归并排序算法,结合实例形式详细分析了归并排序算法的原理、实现步骤、操作技巧与使用方法,需要的朋友可以参考下
    2017-05-05
  • MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程)

    MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程)

    如果电脑没有安装MinGW-w64 C/C++编译器,就无法运行gcc命令,本文主要介绍了MinGW-w64 C/C++编译器下载和安装的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论