(第12天)【leetcode题解】151、反转字符串中的单词

news/2024/5/19 21:53:47

目录

  • 151、反转字符串中的单词
    • 题目描述
    • 思路
    • 代码
    • 本题反思

151、反转字符串中的单词

题目描述

给你一个字符串 s ,请你反转字符串中单词的顺序。

单词是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。

返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

要求:空间复杂度为O(1);

思路

  1. 去除多余空格:收尾无空格,单词之间只有一个空格
  • 定义快慢指针,快指针负责寻找正确的元素,慢指针负责从头开始给字符串赋值。
  1. 反转字符串
  2. 反转单个单词

代码

class Solution {
public://原地反转字符串void reverse(string& s, int start, int end) {for (int i = start, j = end; i < j; i++,j--) {swap(s[i], s[j]);//交换操作}}//去除多余空格void removeExtraSpaces(string& s) {int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针// 去掉字符串前面的空格while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {fastIndex++;}for (; fastIndex < s.size(); fastIndex++) {// 去掉字符串中间部分的冗余空格if (fastIndex - 1 > 0 && s[fastIndex] == ' ' && s[fastIndex - 1] == s[fastIndex]) {continue;} else {s[slowIndex++] = s[fastIndex];}}if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') { // 去掉字符串末尾的空格s.resize(slowIndex - 1);} else {s.resize(slowIndex); // 重新设置字符串大小}
}//反转字符串中的单词string reverseWords(string s) {removeExtraSpaces(s);//去除多余空格reverse(s, 0, s.size() - 1);//原地反转所有字符//开始逐个反转单词int start = 0;//指向每一个单词的开头for (int i = 0; i <= s.size(); ++i) {if (i == s.size() || s[i] == ' ') {//到达空格或字符串尾部,说明一个单词结束,进行反转reverse(s, start, i - 1);start = i + 1;//把start指向下一个单词的开头}}return s;}
};

优化【去除多余空格函数】之后的代码

class Solution {
public://原地反转字符串void reverse(string& s, int start, int end) {for (int i = start, j = end; i < j; i++,j--) {swap(s[i], s[j]);//交换操作}}//去除空格void removeExtraSpaces(string& s) {int slow = 0;//慢指针辅助赋值操作for (int i = 0; i < s.size();i++) {if (s[i] != ' ') {//如果目前遍历到的字符不是空格,就进行处理if (slow != 0) s[slow++] = ' ';//给每个单词之间添加空格while (i < s.size() && s[i] != ' ') {s[slow++] = s[i++];}}}s.resize(slow);//slow的大小就是删除多余空格后字符串的大小
}//反转字符串中的单词string reverseWords(string s) {removeExtraSpaces(s);//去除多余空格reverse(s, 0, s.size() - 1);//原地反转所有字符//开始逐个反转单词int start = 0;//指向每一个单词的开头for (int i = 0; i <= s.size(); ++i) {if (i == s.size() || s[i] == ' ') {//到达空格或字符串尾部,说明一个单词结束,进行反转reverse(s, start, i - 1);start = i + 1;//把start指向下一个单词的开头}}return s;}
};

时间复杂度:O(n);
空间复杂度:O(1);原地修改字符串。

本题反思

  • 对于字符串的操作类似于数组,也是利用双指针查找正确元素然后进行覆盖操作达到修改字符串的目的。
  • 寻找正确字符的过程就是去除多余空格的过程。
  • 比起整体反转字符串,加入了在整体字符串中反转其中的单词,这需要额外添加条件判断。

http://www.mrgr.cn/p/60401127

相关文章

传统汽车空调系统工作原理

1.首先讲一个概念 液体变成气体&#xff1a;吸热 气体变成液体&#xff1a;放热 2.在汽车空调系统中热量的传递的介质不是水&#xff0c;而是氟利昂&#xff0c;简称&#xff1a;“氟”。 3.传统式汽车空调结构如下 该三个部件位于车头进气口位置 该部位位于汽车驾驶车厢前方…

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

【vue3入门】-【21】 组件传递数据

组件传递数据_Props静态数据传递组件与组件之间不是完全独立的,而是有交集的,那就是组件与组件之间是可以传递数据的 传递数据的解决方案就是props app.vue <template><!--主要要生效Header中的样式,需要删除main.json中默认的main.css样式--><!--不需要再次…

shell脚本编写-测试同一网段内主机是否在线

除了可以使用ansible自动化运维工具判断主机是否在线以外&#xff0c;还可以通过编写Shell脚本来实现。 1、编写脚本 #! /bin/bash #测试192.168.81.0/24网段中哪些主机处于开机状态&#xff0c;哪些主机处于关机状态# #方法一&#xff1a;使用for循环判断 # for i in {1..25…

大学数据结构学不进去怎么办?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;除了极少数的“算法天才”&a…

快讯! MySQL 8.4.0 LTS 发布(MySQL 第一个长期支持版本)

MySQL 第一个长期支持版本 8.4.0 LTS 发布&#xff0c;社区版下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 功能变更 添加或更改的功能 组复制&#xff1a;与组复制相关的两个服务器系统变量的默认值已更改&#xff1a; 系统变量的默认值为 group_replication…

走过人生的复平面:个人信息学奥林匹克生涯回顾

从最开始到一切的结局,完整详细的个人回忆录。走过人生的复平面—— 个人信息学奥林匹克生涯回顾写在前面:一个简单的介绍 信息学奥林匹克竞赛,即 Olympiad in Informatics,AKA OI,而学习 OI 的人则自称为 OIer。通常来讲,一个中国大陆 OIer 的一个赛季是,参加 10 月份的…

计算机视觉——OpenCV Otsu阈值法原理及实现

算法简介 Otsu阈值法&#xff0c;也被称为大津算法&#xff0c;是一种在图像处理中广泛使用的自动阈值分割技术。这种方法由日本学者大津展之于1979年提出&#xff0c;旨在根据图像的灰度直方图来自动选择最佳全局阈值。Otsu阈值法的核心思想是最小化类内方差或最大化类间方差…

springboot项目组合定时器schedule注解实现定时任务

springboot项目组合定时器schedule注解实现定时任务&#xff01; 创建好springboot项目后&#xff0c;需要在启动类上增加注解开启定时器任务 下图所示&#xff1a; 增加这个注解&#xff0c;启动项目&#xff0c; package com.example.scheduledemo.util;import org.springf…

如何批量重命名,把文件(夹)名的内容位置调整(前后移动)

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 情况是这样,把“中文[数字]”的名称,改为"中文 - 数字"打开工具,切换到 文件批量复制 模块,快捷键Ctrl+5找到右下角的“重命名”按钮,打开把那些文件拖入进去,也可以用右侧的导入按钮(如…

vue的template中访问不到变量

描述 源代码 <h4>&emsp;&emsp;{{hitokoto.hitokoto}}</h4>报错如下。解决 普通字符和变量之间加个空格就行了 <h4>&emsp;&emsp; {{hitokoto.hitokoto}}</h4>

Ryght 在 Hugging Face 专家助力下赋能医疗保健和生命科学之旅

本文是 Ryght 团队的客座博文。Ryght 是何方神圣? Ryght 的使命是构建一个专为医疗保健和生命科学领域量身定制的企业级生成式人工智能平台。最近,公司正式公开了 Ryght 预览版 平台。 当前,生命科学公司不断地从各种不同来源 (实验室数据、电子病历、基因组学、保险索赔、药…

如何搜索空文件夹_名称为(纯或含)中/英/数/符

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 打开工具,切换到批量文件复制版块,快捷键Ctrl+5点击右侧的搜索添加设定要搜索的范围、指定为文件夹、包括子目录,勾选详细条件在过滤条件里,勾选“按命名”,“含有内容”,“仅文件夹名”,“任意”…

贪心问题 难度[普及-]一赏

目录 #小A的糖果 删数问题 陶陶摘苹果&#xff08;升级版&#xff09; P5019 NOIP2018 提高组 铺设道路 小A的糖果 原文链接: P3817 小A的糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 小 A 有 n 个糖果盒&#xff0c;第 i 个盒中有 a_i 颗糖果。 小 A 每…

认识linux内核(linux内核的作用)

目录认识linux内核Linux内核实现策略哪些地方用到了内核机制?Linux进程Linux内核源代码的目录结构Linux内核体系结构(就是Linux系统是怎么构成的)Linux体系结构和内核结构区别 认识linux内核 1.从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递…

1-1ARM开发环境搭建(GD32)

1:安装MDK最好是5.27以及以上版本&#xff0c;避免后续学习中出现相关错误 2&#xff1a;安装芯片支持包 双击安装即可&#xff0c;也可以是默认路径&#xff0c;也可以自己更改路径 3&#xff1a;安装jlink下载器驱动&#xff08;下载调试器&#xff09; 具体安装步骤如下所示…

游戏技术人福音!当游戏语音碰到网易云信 ,我服了!

“开黑吗&#xff1f;五黑的那种” 少年时代&#xff0c;放假后偷偷溜进网吧&#xff0c;一边打着游戏&#xff0c;一边连麦吐槽对手的惬意岁月&#xff0c;不仅承载了无数 80 后、90 后&#xff0c;甚至 00 后的青春记忆&#xff0c;也让游戏语音成为了“游戏少年”闲暇生活的…

Python扩展模块的开发

有关python C扩展开发的教程可以参考概述 — Python 3.12.3 文档。项目已经发布至python官方的pypi里了。具体详情请见AdroitFisherman PyPI。目前该项目还处在测试阶段。尚有部分模块需要开发和测试。 项目结构 项目结构见下图&#xff1a; 代码展示与说明 以单链表(SingleL…

C语言—控制语句

控制语句就是用来实现对流程的选择、循环、转向和返回等控制行为。 分支语句 if语句 基本结构 if(表达式) { 语句块1&#xff1b; } else { 语句块2&#xff1b; } 执行顺序&#xff1a; 如果表达式判断成立&#xff08;即表达式为真&#xff09;&#xff0c;则执行语句块…

软件设计师:结构化开发方法

模块化模块独立 软件模块应尽量做到高内聚、低耦合,提高模块的独立性 耦合性无直接耦合:没有直接关系 数据耦合:传递简单的数据值 标记耦合:传递数据结构 控制耦合:传递控制变量 外部耦合:软件之外的环境联结 公共耦合:公共数据环境 内容耦合:通过非正常入口/直接访问内…