当前位置:首页 > 牛客 > 牛客13278题详解:句子单词反转(C++实现)

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

2个月前 (07-12)

牛客13278题详解:句子单词反转(C++实现) 牛客题解 字符串 C++ 第1张

一、题目解读

牛客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()而非手动交换。

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


原创内容 转载请注明出处

分享给朋友:

相关文章

线性遍历+二进制 6行代码征服二进制链表转整数

线性遍历+二进制 6行代码征服二进制链表转整数

力扣1290.二进制链表转整数题目本质给定一个单链表的头节点head,链表中每个节点的值为0或1。链表表示一个‌最高有效位在前‌的二进制数字,要求将其转换为对应的十进制整数。例如链表1→0→1对应的二...

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。