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

贾蔷
• 阅读 86

牛客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星期前
洛谷P1102题解:利用哈希表优化的数对统计 C++代码解析
一、题目解读P1102题要求处理一组整数与常数C,统计数组中是否存在元素A与B满足ABC。用户需输出满足条件的数对数量。题目关键在于快速判断是否存在互补元素,时间复杂度需优化以避免暴力遍历。二、解题思路采用(unorderedmap)实现高效统计。首先遍
深度学习 深度学习
2星期前
LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)
一、题目解读2576题要求在一个整数中寻找最多可标记的下标对:若nums法”的组合思路:1.排序预处理:对原数组nums进行升序排序,确保相同元素聚集,便于后续配对。2.双划分:将排序后的数组分为左右两半(左指针left0,右指针rightn/2),从
贾蔷 贾蔷
4天前
【力扣LCR42题解析】套圈游戏:用距离平方优化算法解题
一、题目解读LCR42题“圆圈游戏”要求计算给定玩具集合中,能被套圈覆盖的玩具数量。每个玩具和套圈均由坐标及半径定义,需判断玩具是否在套圈覆盖范围内。题目核心在于高效计算点与圆的位置关系,并统计符合条件的结果。二、解题思路采用“半径预筛选距离平方判定”策
深度学习 深度学习
4天前
洛谷P2758题解:动态规划求解编辑距离的完整攻略
一、题目解读P2758题要求计算两个之间的编辑距离,即通过插入、删除、替换三种操作将字符串A转换为B所需的最小操作次数。题目考察的核心是在中的应用,需要找到最优的路径。二、解题思路采用(DynamicProgramming)策略。核心思想是构建二维dp,d
贾蔷 贾蔷
4天前
力扣15题三数之和解法(C++双指针算法详解)
一、题目解读15题()要求在一个包含n个整数的中,找出所有三个数之和为0的组合,且每个组合的元素不能重复。题目考察数组遍历、与技巧的结合,是经典的多问题,对时间复杂度优化有较高要求。二、解题思路采用“双指针”策略:首先对原数组排序,然后固定第一个数,通过左
贾蔷 贾蔷
1个月前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
上海张律师 上海张律师
1个月前
英语单词学习页面+单词朗读实现 -- 【1】页面实现 ##HarmonyOS SDK AI##
​先看一下页面效果整体页面是一个比较简洁的页面,其中有两个特色功能1.对于例句中,能够实现将当前的单词从句子中进行识别并突出显示2.对于单词和句子,可以进行朗读,这个朗读使用的是CoreSpeechKit(基础语音服务),即端侧AI我们分两篇文章来讲解对于