找回密码
 立即注册
查看: 27|回复: 0

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

[复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:18
  • 打卡月天数:2
  • 打卡总奖励:194
  • 最近打卡:2025-08-14 15:12:44

22

主题

8

回帖

1万

积分

VIP

积分
10219
发表于 2025-7-15 14:52:34 | 显示全部楼层 |阅读模式
截图未命名.jpg
一、题目解读
牛客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()而非手动交换。
掌握此类字符串处理技巧,可高效应对类似算法题目,提升代码健壮性。

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

本版积分规则

SEO网站 ( 冀ICP备2025113422号-2 )|网站地图

Powered by Discuz! X3.5

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