剑指 Offer 58 - I. 翻转单词顺序

news/2024/11/25 1:24:00/

剑指 Offer 58 - I. 翻转单词顺序

题目:

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

  • 无空格字符构成一个单词。

  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

思路一:

逆序双指针

1.用n记录当前字符串长度,再开辟一个新的字符串str用来存放逆序遍历到的单词;

2.逆序遍历,当字符不为空格时,使用right记录下当前i的位置,然后i--向前查找下一个空格,当s[i] == ' '时,可以通过right - i 得到当前单词的长度,i + 1得到单词的首字母,通过substr函数将该单词放到新的字符串str中;

3.当我们逆序遍历完成之后,得到新的字符串,此时str已经是原来字符串翻转后形成的,但是要注意的是,使用str += s.substr(i + 1, right - i) + " "str中追加最后一个单词时,空格也被放到了里面,所以要单独对最后一个空格进行处理;

  • 可以使用substr函数进行处理即return str.substr(0,str.size() - 1)

  • 也可以使用erase函数删除最后一个空格,但是此时要判断str是否为空字符串,避免erase时数组越界;

  • 还可以使用pop_back函数直接尾删掉最后一个字符。

我们以字符串 we are family为例,头部两个空格,arefamily中间三个空格,尾部三个空格。具体过程可参考下图:

image-20230525101542982

代码如下:

class Solution {
public:string reverseWords(string s) {int n = s.size(); string str;//string类默认值为空//从结尾开始向前遍历,这样的话不用翻转,单词顺序直接就是翻转后的for(int i = n - 1; i >= 0; i--){//当s[i]不为空时,追加到新字符串if(s[i] != ' '){int right = i;//记录此时i的位置while( i >= 0 && s[i] != ' ' ) //要注意这里条件的先后顺序{i--;}//right - i 计算的是字符长度//s[i]此时为空格,i+1就是单词的首个字符str += s.substr(i + 1, right - i) + " "; }}//最后这里的str字符串最后一个元素为空格// 1.  return str.substr(0,str.size() - 1);//3. str.pop_back();//	return str;//2.if(str == "") //还要考虑当字符串为空的情况return str;str.erase(str.size() - 1, 1);return str;}
};

时间复杂度:O(N)

空间复杂度:O(N)

思路二:

通过三个指针对原子符串进行修改从而实现翻转单词顺序。

1.先将整个字符串翻转;

2.设置一个变量idx用来将单词从头开始填入字符串,设置变量start从头开始找,当s[start] != ' '时,说明此时为单词的头部,向后遍历,当s[end] != ' '时找到单词结尾,通过reverse(s.begin() + idx - (end -start), s.begin() + idx);对单词进行翻转;

3.start = end;更新start,并找下一个单词……当idx != 0时说明已经插入了单词需要添加空格 s[idx++] = ' '

4.当字符串中单词找完,即循环结束之后,s.erase(s.begin() + idx,s.end());删除idx开始的往后的字符,因为原字符串中的单词已经通过循环放到了前面。

我们以字符串 we are family为例,头部两个空格,arefamily中间三个空格,尾部三个空格。具体过程可参考下图:

image-20230525112304216

代码如下:

class Solution {
public:string reverseWords(string s) {//直接翻转整个字符串reverse(s.begin(),s.end());int n = s.size();int idx = 0; //用来记录单词和给空格for(int start = 0; start < n; start++){//当s[start]不等于空格时记录单词if(s[start] != ' '){//当idx不等于0时,说明此时字符串已经完成了一个单词的写入,所以要加上空格if(idx != 0) s[idx++] = ' ';//开始向后遍历,找到单词的结尾int end = start;while(end < n && s[end] != ' ')s[idx++] = s[end++];//单词写入之后对这个单词进行翻转reverse(s.begin() + idx - (end -start), s.begin() + idx);//再更新start,找下一个单词start = end;}}//将从idx开始的往后的字符全部删除s.erase(s.begin() + idx,s.end());return s;}
};

时间复杂度:O(N)

空间复杂度:O(1)


http://www.ppmy.cn/news/82553.html

相关文章

Spring Boot中使用Spring Data Elasticsearch访问Elasticsearch

Spring Boot中使用Spring Data Elasticsearch访问Elasticsearch Elasticsearch是一个分布式的全文搜索和分析引擎&#xff0c;它可以将海量数据进行快速的查询和聚合。Spring Data Elasticsearch是Spring Data家族中的一个成员&#xff0c;它提供了与Elasticsearch的集成&…

出门没带本子记的单词|10:20~10:40

susceptible adj 易受影响的 unify v 统一 auditory adj 听觉的 / ˈɔːdətɔːri / combat v 与...搏斗、防止 comfort n 舒适 constrain v 约束、迫使 fringe …

中小企业热衷于做网络营销的原因有哪些?

随着互联网的快速发展&#xff0c;网络营销已经成为了现代企业营销中不可或缺的一部分。在这个过程中&#xff0c;中小企业热衷于网络营销的原因也越来越多地被人们所关注。那么&#xff0c;中小企业为什么热衷于网络营销呢&#xff1f;下面就为大家详细阐述。 一、网络营销成本…

深入浅出Vite:深入理解 Rollup 的插件机制

上一节我们学会了 Rollup 构建工具的使用&#xff0c;相信你已经对 Rollup 的基础概念和使用有了基本的掌握。同时我们也知道&#xff0c;仅仅使用 Rollup 内置的打包能力很难满足项目日益复杂的构建需求。对于一个真实的项目构建场景来说&#xff0c;我们还需要考虑到模块打包…

MySQL基础 — 多表查询以及事务管理

文章目录 MySQL基础 — 多表查询以及事务管理一、多表查询1.1 对应关系1.2 准备数据1.3 概述1.4 内连接1.5 外连接1.6 自连接1.7 联合查询 union1.8 子查询1.8.1 标量子查询1.8.2 列子查询1.8.3 行子查询1.8.4 表子查询 二、事务2.1 简介2.2 操作演示2.3 控制事务2.3.1 控制事务…

机器学习随记(9)

1.问&#xff1a;怎么看出一个模型是过拟合还是欠拟合&#xff1f; 在机器学习中&#xff0c;过拟合和欠拟合是两个常见的问题&#xff0c;可以通过观察模型在训练集和测试集上的表现来判断模型是过拟合还是欠拟合。 过拟合&#xff1a;当模型在训练集上表现很好&#xff0c;但…

Mysql日期时间函数

1.获取当前时刻时间 获取当前时刻的时间就是获取程序运行的那一刻与时间相关的数据&#xff0c;比如年月日、时分秒等信息。 1.1返回当前时刻的日期和时间 返回当前时刻的日期和时间在ESql中用的是now()函数&#xff0c;直接在select后面写上now()函数即可&#xff0c;具体代…

饥荒联机版 Don‘t Starve Together服务器架设

饥荒服务器搭建 饥荒联机版 Dont Starve TogetherSTEAMCMD安装WINDOWS 系统Linux 系统(这里主要讲在群辉synology系统中搭建)Ⅰ.运行环境Ⅱ.下载安装Ⅲ.配置游戏1.服务器配置 cluster.ini2.森林世界server.ini配置 Ⅳ.运行游戏-- 报错提示1.error while loading shared librari…