题目描述:

给定一个字符串,逐个翻转字符串中的每个单词。

说明:

无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

示例:

输入:"  hello world!  "
输出:"world! hello"
解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

分析:本题考查的重点是能够 在原字符串上实现 时间 O(n) 空间(1) 的算法

代码如下:
 1 #ifndef SOLUTION_SOLUTION_H
2 #define SOLUTION_SOLUTION_H
3
4 #include <bits/stdc++.h>
5
6 using namespace std;
7
8 class Solution
9 {
10 public:
11 //Time:O(n) space: O(1)
12 string reverseWords(string s) {
13 // 反转整个字符串
14 reverse(s.begin(), s.end());
15
16 int n = s.size();
17 int idx = 0;//指向刚放好并翻转过的单词的后一个位置
18 for (int start = 0; start < n; ++start) {
19 if (s[start] != ' ')
20 {
21 // 在刚放好的单词后填充一个空白字符,idx前进一位指向下一个单词该放到的起始位置
22 // 第一个单词直接从 0 处开始放,前面不需要填充空格
23 if (idx != 0) s[idx++] = ' ';
24 //保存下一个单词该放到的起始位置
25 int begin_tmp = idx;
26 // 循环遍历至单词的末尾
27 int end = start;
28 while (end < n && s[end] != ' ') s[idx++] = s[end++];
29
30 // 反转刚放好的单词
31 reverse(s.begin() + begin_tmp, s.begin() + idx);
32 // 更新start,去找下一个单词
33 start = end;
34 }
35 }
36 //删去字符串尾部的空格
37 s.erase(s.begin() + idx, s.end());
38 return s;
39 }
40 };
41
42 #endif //SOLUTION_SOLUTION_H

最新文章

  1. SQL SERVER 数据库各版本功能对比
  2. java.sql.Connection解决插入数据库中文乱码问题
  3. java 创建string对象机制 字符串缓冲池 字符串拼接机制
  4. [attribute=value] 匹配给定的属性是某个特定值的元素
  5. linux设备驱动归纳总结(五):4.写个简单的LED驱动【转】
  6. PHP5.4连接sqlserver
  7. MVC 实现计算页面执行时间
  8. 关于Spring的IOC和DI
  9. JavaScript高级程序设计(第三版)学习笔记1~5章
  10. iOS App上传中遇到的问题
  11. 基于cygwin构建u-boot(一)环境搭建
  12. C# 开机自动启动程序
  13. CDockablePane使用总结
  14. 安装MongoDB步骤
  15. 微信小程序我的界面
  16. PyJWT 使用
  17. 如何实现基于ssh框架的投票系统的的质量属性
  18. zend studio调试
  19. [Laravel] 10 - WEB API : wrapper
  20. day15-python常用内置模块的使用

热门文章

  1. 矩阵连乘问题的算法复杂度的计算--卡塔兰数(Catalan数)的数学推导和近似公式
  2. 14 RPC
  3. yum源备份并安装扩展仓库
  4. Spark Shuffle机制详细源码解析
  5. Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈
  6. 利用 Github Actions 的 service container 进行集成测试
  7. Js中函数声明和函数表达式的区别
  8. 精尽 MyBatis 源码分析 - 整体架构
  9. 如何使用GitHub创建Maven私有仓库
  10. Netty源码解析 -- 内存对齐类SizeClasses