查看: 43|回复: 0

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

[复制链接]
  • TA的每日心情
    无聊
    昨天 10:23
  • 签到天数: 52 天

    [LV.5]常住居民I

    51

    主题

    0

    回帖

    86

    积分

    注册会员

    Rank: 2

    积分
    86
    发表于 2025-7-15 14:49:44 | 显示全部楼层 |阅读模式
    一、题目解读
    牛客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函数提升效率,避免手动循环遍历的易错点。
    四、代码和注释
    1. #include <iostream>
    2. #include <vector>
    3. #include <sstream>
    4. #include <algorithm>

    5. using namespace std;

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

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

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

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

    26.     return result;
    27. }

    28. int main() {
    29.     string line;
    30.     while (getline(cin, line)) {
    31.         cout << reverseSentence(line) << endl;  // 持续处理输入
    32.     }
    33.     return 0;
    34. }
    复制代码


    五、总结
    本解法关键在于巧妙利用STL函数(erase, stringstream, reverse)降低编程复杂度。需注意:
    1. 首尾空格处理需明确非空格字符的位置,避免误删单词内容。
    2. 分割时使用stringstream自动处理空格,无需手动解析。
    3. 算法优化点在于减少循环次数,直接调用reverse()而非手动交换。
    掌握此类字符串处理技巧,可高效应对类似算法题目,提升代码健壮性。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表