文章目录

  • 题目描述
    • 题解思路
      • 方法一:双指针
      • 方法二:单词逐个反转、再整体反转

题目描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"

示例 2:

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

示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

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

题解思路

方法一:双指针

  • 倒序遍历字符串 s ,记录单词左右索引边界 i , j ;
  • 每确定一个单词的边界,则将其添加至单词列表 res ;
  • 最终,将单词列表拼接为字符串,并返回即可。

复杂度分析:

  • 时间复杂度 O(N) : 其中 N 为字符串 s 的长度,线性遍历字符串。
  • 空间复杂度 O(N) : 新建的字符串总长度 ≤N ,占用 O(N) 大小的额外空间。

代码实现:

class Solution {public:string reverseWords(string s) {int len = s.length();if (len == 0) {return "";}int j = len - 1;string res = "";while (j >= 0) {if (s[j] == ' ') {// 当 s[j] 是空格时,j 不断左移j--;continue;}while (j >= 0 && s[j] != ' ') {// 注意 while 里必须用 && 短路求值,且 j >= 0 要放前面// 不然如果 j 变成 -1,那么计算 s[j] 会发生溢出错误!j--;}int pos = j; // 用 pos 保存 j 当前的位置j++; // j 现在指向的是一个空格,需要右移一位才能指向一个单词的开头while (s[j] != ' ' && j < len) {// 向 res 中添加单词res += s[j];j++;}j = pos; // j 回到新添加的单词的最左端再往左一个空格处res += ' '; // 单词添加完毕后需要加上一个空格}if(res.length() > 0){res.erase(res.length() - 1, 1);}return res;}
};

方法二:单词逐个反转、再整体反转

  1. 我们首先去除 s 首尾的空格。然后翻转整个 s。比如 s = " hi grosec ",会变成 s = “cesorg ih”。
  2. 然后我们再通过 i 和 j 来定位 s 中每个单词的首尾(左闭右闭),然后依次翻转每个单词。比如上面的 s = “cesorg ih”,我们将会依次翻转 “cesorg” 和 “ih”,从而最终得到 s = “grosec hi”。
  3. 在上面这个过程中,处理完一个单词之后,j 会右移,这期间会判断是否存在多个空格,如果是,则会循环 erase 多余的空格。

复杂度分析:

  • 时间复杂度 O(1)O(1)O(1) : 其中 N 为字符串 s 的长度,线性遍历字符串。
  • 空间复杂度 O(N)O(N)O(N) : 新建的字符串总长度 ≤N ,占用 O(N)O(N)O(N) 大小的额外空间。

代码实现:

class Solution {public:string reverseWords(string s) {int k = 0;for (int i = 0; i < s.size(); ++i){while (i < s.size() && s[i] == ' ') {++i;    // 找到第一个非空格字符}if (i == s.size()) break;int j = i;while (j < s.size() && s[j] != ' ') ++j;    //遍历1个非空单词reverse(s.begin() + i, s.begin() + j);      //反转1个单词if (k) s[k++] = ' ';while (i < j) s[k++] = s[i++];      //反转后的1个单词赋给s[k]}s.erase(s.begin() + k, s.end());   //删除 k后面空格reverse(s.begin(), s.end());return s;}
};

如有帮助到您,可以多多点赞、评论鼓励哟~~~

[剑指Offer]:翻转单词顺序相关推荐

  1. 剑指Offer - 翻转单词顺序列

    题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"st ...

  2. 剑指Offer——翻转英文句子中的单词顺序

    主要思路: 先交换整个句子的顺序,再交换每个单词的顺序. 一下代码在VS2015中调试无误 #include "stdafx.h" #include<iostream> ...

  3. 剑指Offer Ⅱ 005.单词长度的最大乘积 (力扣剑指Offer专项突击版——整数_5)

    题目 给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值.假设字符串中只包含英语的小写字母.如果没有不包含相同字符的一 ...

  4. 剑指offer 调整数组顺序使奇数位于偶数前面

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 分析: 我的思路 ...

  5. 《剑指offer》扑克牌顺序

    题目:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)-他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体 ...

  6. 剑指offer 翻转链表

    输入一个链表,反转链表后,输出链表的所有元素. public class Solution {public ListNode ReverseList(ListNode head) {if(head== ...

  7. 【LeetCode笔记】剑指 Offer 21-. 调整数组顺序使奇数位于偶数前面(Java、双指针)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 有点像快排的交换操作 思路 & 代码 类似快排中的找法,具体见代码注释 class Solution {public int[] e ...

  8. 剑指offer-翻转单词顺序列

    剑指offer-翻转单词顺序列 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂 ...

  9. 【LeetCode】剑指 Offer 58 - I. 翻转单词顺序

    [LeetCode]剑指 Offer 58 - I. 翻转单词顺序 文章目录 [LeetCode]剑指 Offer 58 - I. 翻转单词顺序 一.双指针 一.双指针 算法解析: 倒序遍历字符串 s ...

  10. 剑指 Offer 58 - I. 翻转单词顺序 (双指针)

    剑指 Offer 58 - I. 翻转单词顺序 题意: 翻转一个英文句子中单词顺序 解法1 思路: split分割 + 倒序 public static String reverseWords(Str ...

最新文章

  1. Django 图片上传upload_to路径指定失效的问题记录
  2. CEGUI-----动画
  3. 构建基于Ceph的文件共享服务
  4. Hello Blazor:(1)像ASP.NET WebForm一样写代码
  5. HTML5 文件域+FileReader 分段读取文件(四)
  6. 二进制安装mysql5.7
  7. 分析lammps文件_LAMMPS学习系列(24)
  8. 直播间搭建项目——延续直播发展趋势
  9. go15---select
  10. linux 互斥锁优先级反转,互斥锁陷阱:优先级反转、死锁
  11. ax 2012 随笔
  12. PHP新闻管理系统(包括前台后台)
  13. 基于ResNet迁移学习的LFW人脸识别分类
  14. 景区分时实名预约系统
  15. 非负矩阵分解与K-means聚类
  16. 方程检验格式图片_eviews的异方差检验ppt课件
  17. 2021高考自贡成绩查询,多图|自贡2021高考进行时
  18. 汽车电子行业英语、缩写、中英对照
  19. 阿里云手机验证码获取接口【接口对接的时候要仔细把里面的参数换成自己的参数即可】
  20. 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)

热门文章

  1. 微课在小学计算机教学中的应用,微课技术在小学信息技术课堂中的应用
  2. 统计模型评价准则 AIC
  3. word文件做一半未响应_word编辑一半未响应怎么办
  4. 圆周运动的古中医学摘抄
  5. 图像坐标球面投影_图像の球面投影算法
  6. 许奔创新社-第38问:如何练就跨界打劫的本领?
  7. ubuntu中用gimp 将psd文件分解
  8. hunnu 10246 最大间隙问题 桶排序+抽屉原理
  9. 阿里云服务器怎么购买才更划算(新手教程)
  10. python 取名字_个人儿子叫派森,用python程序化取名字,他管这叫爹?