牛客13278题详解:句子单词反转(C++实现)

贾蔷
• 阅读 24

牛客13278题详解:句子单词反转(C++实现)

一、题目解读

牛客13278题要求编写函数实现句子中单词顺序的反转,例如将"Hello World"转换为"World Hello"。需注意处理首尾空格、单词间空格数量保持原样,仅单词顺序颠倒。题目考察对字符串操作的掌握,特别是分割与重组技巧。

二、解题思路

采用分治策略

  1. 预处理:去除句子首尾多余空格,避免干扰后续操作。

  2. 分割单词:利用stringstream将句子按空格分割为单词向量。

  3. 反转单词:直接对单词向量进行反转,高效改变顺序。

  4. 重组句子:按反转后的顺序拼接单词,中间添加空格。

核心逻辑在于“分割-反转-重组”,减少手动处理空格的复杂度。

三、解题步骤

  1. 去除首尾空格:使用erase()结合find_first_not_of()和find_last_not_of()定位首尾非空格字符,删除多余空格。

  2. 单词分割:通过stringstream逐词读取,存入words向量,利用空格自然分隔。

  3. 单词反转:调用reverse()算法直接反转单词顺序,无需手动交换。

  4. 句子重组:遍历反转后的单词,依次拼接,中间添加单个空格。

步骤简洁,利用STL函数提升效率,避免手动循环遍历的易错点。

四、代码和注释

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>

using namespace std;

// 函数:反转句子单词顺序
string reverseSentence(string s) {
    // 去除首尾空格
    s.erase(0, s.find_first_not_of(" "));  // 删除开头空格
    s.erase(s.find_last_not_of(" ") + 1);  // 删除末尾空格

    // 使用字符串流分割单词
    vector<string> words;
    stringstream ss(s);
    string word;
    while (ss >> word) {
        words.push_back(word);  // 存入单词向量
    }

    // 反转单词顺序
    reverse(words.begin(), words.end());  // STL算法简化操作

    // 重新组合句子
    string result;
    for (int i = 0; i < words.size(); ++i) {
        if (i!= 0) result += " ";  // 非首个单词前加空格
        result += words[i];
    }

    return result;
}

int main() {
    string line;
    while (getline(cin, line)) {
        cout << reverseSentence(line) << endl;  // 持续处理输入
    }
    return 0;
}

五、总结

本解法关键在于巧妙利用STL函数(erase, stringstream, reverse)降低编程复杂度。需注意:

  1. 首尾空格处理需明确非空格字符的位置,避免误删单词内容。

  2. 分割时使用stringstream自动处理空格,无需手动解析。

  3. 算法优化点在于减少循环次数,直接调用reverse()而非手动交换。

掌握此类字符串处理技巧,可高效应对类似算法题目,提升代码健壮性。

来源:信奥自学之路

点赞
收藏
评论区
推荐文章
lucien-ma lucien-ma
4年前
Markdown基础语法学习
Markdown学习标题三级标题:空格标题四级标题:空格标题一级、二级以此类推(最多六级)字体样式helloworld&nbsp;&nbsp;斜体:&nbsp;helloworld(注意星号和单词之间是没有空格的,下同)helloworld&nbsp;&nbsp;加粗:&nbsp;&nbsp;hellowor
Stella981 Stella981
3年前
POJ2503(Babelfish)
思路:就是用一个字典树翻译单词的问题,我们用题目中给出的看不懂的那些单词建树,这样到每个单词的叶子结点中存放原来对应的单词就好。这样查询到某个单词时输出叶子结点存的就行,查不到就"en"呗。这题用hash也是可以的1include<iostream2include<cstdio3include<std
Stella981 Stella981
3年前
MapReduce实现单词统计
开发工具:IDEAmapreduce实现思路:Map阶段:a) 从HDFS的源数据文件中逐行读取数据b) 将每一行数据切分出单词c) 为每一个单词构造一个键值对(单词,1)d) 将键值对发送给reduceReduce阶段:a) 接收map阶段输出的单词键值对b) 将相同单词的键值对汇聚成一组c) 对每
贾蔷 贾蔷
2星期前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
贾蔷 贾蔷
2星期前
牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)
一、题目解读牛客13279题要求计算给定树的最大高度。题目输入一棵以邻接表形式表示的树(节点从0开始编号),需要输出从根节点到最深叶节点的最长路径长度。树的结构由n个节点和n1条边构成,保证为连通无环图。理解题目核心在于准确获取树的拓扑关系,并设计算法遍历
上海张律师 上海张律师
2星期前
英语单词学习页面+单词朗读实现 -- 【1】页面实现 ##HarmonyOS SDK AI##
​先看一下页面效果整体页面是一个比较简洁的页面,其中有两个特色功能1.对于例句中,能够实现将当前的单词从句子中进行识别并突出显示2.对于单词和句子,可以进行朗读,这个朗读使用的是CoreSpeechKit(基础语音服务),即端侧AI我们分两篇文章来讲解对于
深度学习 深度学习
2天前
NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解
一、题目解读问题(,)要求使用给定数量的火柴棒,构造形如ABC的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式数量。题目核心在于将数字拆解与火柴棒消耗建模为数学问题,寻找高效解法。二、解题思路采用火柴棒计数策略:1.关系
贾蔷 贾蔷
2天前
2024蓝桥杯省赛B组“传送阵”题解
一、题目解读2024年省B组“传送阵”题目要求处理一个包含n个节点的,节点间存在单向传输关系。每个节点i可传送至a中的最长路径问题,需考虑环的存在及节点间的连通性。二、解题思路1.预处理阶段使用标记法找出所有环,记录每个环的大小(即节点数)。2.统计最大环
贾蔷 贾蔷
1个月前
力扣145题:二叉树的后序遍历, 解题思路与C++实现
题目介绍力扣第145题要求实现一个函数,该函数接收一个二叉树的根节点,并返回该树的后序遍历结果。后序遍历是一种遍历二叉树的算法,其顺序为:先遍历左子树,是右子树,是根节点。解题思路分析解题时,我们可以使用递归或迭代的方法。递归方法较为直观,但可能导致栈溢出
贾蔷 贾蔷
1个月前
2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略
一、题目解读2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。二、解题思路采用位运算