[剑指Offer]:翻转单词顺序
文章目录
- 题目描述
- 题解思路
- 方法一:双指针
- 方法二:单词逐个反转、再整体反转
题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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;}
};
方法二:单词逐个反转、再整体反转
- 我们首先去除 s 首尾的空格。然后翻转整个 s。比如 s = " hi grosec ",会变成 s = “cesorg ih”。
- 然后我们再通过 i 和 j 来定位 s 中每个单词的首尾(左闭右闭),然后依次翻转每个单词。比如上面的 s = “cesorg ih”,我们将会依次翻转 “cesorg” 和 “ih”,从而最终得到 s = “grosec hi”。
- 在上面这个过程中,处理完一个单词之后,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]:翻转单词顺序相关推荐
- 剑指Offer - 翻转单词顺序列
题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"st ...
- 剑指Offer——翻转英文句子中的单词顺序
主要思路: 先交换整个句子的顺序,再交换每个单词的顺序. 一下代码在VS2015中调试无误 #include "stdafx.h" #include<iostream> ...
- 剑指Offer Ⅱ 005.单词长度的最大乘积 (力扣剑指Offer专项突击版——整数_5)
题目 给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值.假设字符串中只包含英语的小写字母.如果没有不包含相同字符的一 ...
- 剑指offer 调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 分析: 我的思路 ...
- 《剑指offer》扑克牌顺序
题目:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)-他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体 ...
- 剑指offer 翻转链表
输入一个链表,反转链表后,输出链表的所有元素. public class Solution {public ListNode ReverseList(ListNode head) {if(head== ...
- 【LeetCode笔记】剑指 Offer 21-. 调整数组顺序使奇数位于偶数前面(Java、双指针)
文章目录 题目描述 思路 & 代码 二刷 题目描述 有点像快排的交换操作 思路 & 代码 类似快排中的找法,具体见代码注释 class Solution {public int[] e ...
- 剑指offer-翻转单词顺序列
剑指offer-翻转单词顺序列 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂 ...
- 【LeetCode】剑指 Offer 58 - I. 翻转单词顺序
[LeetCode]剑指 Offer 58 - I. 翻转单词顺序 文章目录 [LeetCode]剑指 Offer 58 - I. 翻转单词顺序 一.双指针 一.双指针 算法解析: 倒序遍历字符串 s ...
- 剑指 Offer 58 - I. 翻转单词顺序 (双指针)
剑指 Offer 58 - I. 翻转单词顺序 题意: 翻转一个英文句子中单词顺序 解法1 思路: split分割 + 倒序 public static String reverseWords(Str ...
最新文章
- Django 图片上传upload_to路径指定失效的问题记录
- CEGUI-----动画
- 构建基于Ceph的文件共享服务
- Hello Blazor:(1)像ASP.NET WebForm一样写代码
- HTML5 文件域+FileReader 分段读取文件(四)
- 二进制安装mysql5.7
- 分析lammps文件_LAMMPS学习系列(24)
- 直播间搭建项目——延续直播发展趋势
- go15---select
- linux 互斥锁优先级反转,互斥锁陷阱:优先级反转、死锁
- ax 2012 随笔
- PHP新闻管理系统(包括前台后台)
- 基于ResNet迁移学习的LFW人脸识别分类
- 景区分时实名预约系统
- 非负矩阵分解与K-means聚类
- 方程检验格式图片_eviews的异方差检验ppt课件
- 2021高考自贡成绩查询,多图|自贡2021高考进行时
- 汽车电子行业英语、缩写、中英对照
- 阿里云手机验证码获取接口【接口对接的时候要仔细把里面的参数换成自己的参数即可】
- 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)