77、【字符串】leetcode ——151. 反转字符串中的单词(C++版本)

news2024/9/28 9:21:14

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原题链接:151. 反转字符串中的单词

解题思路

  1. 先预处理头部空格和中间多余空格;
  2. 再将整体进行逆转。例如:the sky is blue —> eulb si yks eht
  3. 最后,分别对每个单词进行逆转,即可完成反转字符串。例如:eulb si yks eht —> blue is sky the

一、采用erase处理

class Solution {
public:
    // 预处理。注意:每次erase之后,都会改变s的长度,要更新指针位置
    void preprocessingWords(string &s) {
        // 删除头部空格
        int i = 0;
        while(s[i] == ' ')      i++;
        s.erase(0, i);
        // 删除尾部空格
        int j = s.size() - 1;        
        while(s[j] == ' ')      j--;
        s.erase(j + 1, s.size() - 1 - j);   // 要用最新的长度
        // 删除中间多余空格
        int k = 0;   
        while(k < s.size() - 1) {
            // 删除一个元素后,k位置保持不变,而此时k指向的字符为新字符,因此不需要再k++
            if(s[k] == ' ' && s[k + 1] == ' ') {
                s.erase(k, 1);                
            } else {
                k++;
            }
        }
    }
    string reverseWords(string s) {          
        // 预处理            
        preprocessingWords(s);     
        // 整体逆转
        reverse(s.begin(), s.end());        
        // 按单词逆转
        int n = s.size();        
        int l = 0;			// l:记录每个单词的首部位置
        while(l < n) {
            int r = l;      // r:记录每个单词的末尾位置
            while(r < n && s[r] != ' ')     r++;  
            // 跳出循环时,为s[r] = ' ' 或 r = n,都为进行逆转条件
            reverse(s.begin() + l, s.begin() + r);	// 左闭右开,进行逆转
            l = r + 1;      // 更新下一轮逆值起点
        }                    
        return s;
    }
};

时间复杂度 O ( n 2 ) O(n^2) O(n2) (erase为O(n),erase外还有一个while O ( n 2 ) O(n^2) O(n2))
空间复杂度 O ( 1 ) O(1) O(1)

二、采用移除元素解题方式预处理

采用 203. 移除链表元素 的方式去处理空格,使用快慢指针,快指针进行遍历,慢指针用来存储。
快指针遍历到非空格元素后,慢指针就依次存储。由于每个单词之间有一个空格并且开头和尾部没有空格,因此每次给非开头单词加一个空格,用来分割单词。

class Solution {
public:
    void preprocessingWords(string &s) {
        int n = s.size();
        int i = 0;                      // 慢指针
        for(int j = 0; j < n; j++) {    // 快指针
            if(s[j] != ' ') {           // 当不为空格时,将单词加入到字符串中
                if(i != 0)      s[i++] = ' ';   // 非开头单词时,每次为填充单词前,加一个空格
                while(j < n && s[j] != ' ')     s[i++] = s[j++];    // 填充单词
            }
        }
        s.resize(i);
    }
    string reverseWords(string s) {
        // 预处理
        preprocessingWords(s);
        // 整体反转字符串
        reverse(s.begin(), s.end());
        // 反转每个单词
        int n = s.size();
        int l = 0;			// l:记录每个单词的首部位置
        while(l < n) {
            int r = l;      // r:记录每个单词的末尾位置
            while(r < n && s[r] != ' ')     r++;  
            // 跳出循环时,为s[r] = ' ' 或 r = n,都为进行逆转条件
            reverse(s.begin() + l, s.begin() + r);	// 左闭右开,进行逆转
            l = r + 1;      // 更新下一轮逆值起点
        }      

        return s;
    }
};

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( 1 ) O(1) O(1)

参考文章:151.翻转字符串里的单词

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生产制造业订单管理软件如何做好订单变更管理?

生产制造企业&#xff0c;由于客户需求具有多样性和不确定性&#xff0c;客户订单的内容便会存在出现各种变更的可能&#xff0c;如数量、交期、更改具体参数等&#xff0c;提出变更订单&#xff0c;是很常见的现象。生产制造企业常见的订单变更需求1、PMC已经下完制令后&#…

户外运动耳机怎么选、五款最适合户外运动的耳机分享

对于运动爱好者来说&#xff0c;很多人都比较喜欢边听音乐边运动&#xff0c;音乐能够让运动起来更有激情&#xff0c;提升运动锻炼效果。那么到底什么耳机更适合户外运动呢&#xff1f;目前运动耳机在市面上有很多&#xff0c;但不是每一款都适合户外运动&#xff0c;自己找的…

7.Express模块基础用法

Express是做web服务器的&#xff0c;是一个第三方的包&#xff0c;官网 Express - 基于 Node.js 平台的 web 应用开发框架 - Express 中文文档 | Express 中文网 Express的部分用法与http模块类似 在我看来Express是一个轻量级的框架&#xff0c;如果用于做一些较复杂的业务会…

亚马逊、阿里国际、Shopee、Temu等跨境电商平台测评自养号经验分享

对于亚马逊、temu、阿里国际等平台商家来说&#xff0c;流量非常重要。商家需要想办法提高流量。卖家店铺没有流量怎么办&#xff1f; 获取流量的第一点:自然搜索 自然搜索流量的来源实际上是通过站点的优化来提高排名的效果。站点优化有很多维度&#xff0c;如选择合适的关键…

嵌入式工程师招聘要求有哪些?

现在有非常多的朋友会问嵌入式软件工程师在实际的招聘中都是什么样的标准与要求呢&#xff0c;对于这个问题空口无凭&#xff0c;我今天从招聘网站上找了一些典型的招聘案例。 一、嵌入式软件工程师 职位描述&#xff1a; 1、对需求进行分析评审&#xff0c;并输出开发计划&a…

基于Vue和SpringBoot的进销存管理系统的设计和实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

【阶段二】Python数据分析Pandas工具使用08篇:探索性数据分析:数据的描述:数据的分散趋势与数据的分布形态

本篇的思维导图: 数据的分散趋势 数据的分散趋势是用来刻画数值型变量偏离中心的程度,最为常用的分散趋势指标有标准差、极差、四分位差等。通过这些指标可以反映样本之间的差异大小,如果指标值越大,说明样本之间差异越明显,反之差异越小。 方差与标准差 …

阿里云产品专家陶炳哲:Java应用最佳实验

2022 年 9 月 28 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 11 期活动在深圳举办。活动现场&#xff0c;阿里云产品专家陶炳哲向参会企业分享了《Java 应用最佳实验》。本文根据演讲内容整理而成。 大家好&#xff0c;我是陶炳哲&#xff0c;是阿里云产品专家。…

React(coderwhy)- 02(函数组件)

React的组件化开发 组件化是一种分而治之的思想&#xff1a; 如果我们将一个页面中所有的处理逻辑全部放在一起&#xff0c;处理起来就会变得非常复杂&#xff0c;而且不利于后续的管理以及扩展。 但如果&#xff0c;我们讲一个页面拆分成一个个小的功能块&#xff0c;每个功能…

191:vue+openlayers 选择feature,固定按钮删除selected feature

第191个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中使用select来选择feature元素,通过按键来删除selected的feature。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共95行)相关API参考专栏目标…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的ROS(Robot Operating System)算法模型

给我推荐20个比较流行的ros算法模型 很好&#xff0c;下面是20个比较流行的ROS(Robot Operating System)算法模型&#xff1a; 便携式机器人操作系统(PR2) 全向轮操作系统(TurtleBot) 机器人操作系统(ROS)用于机器人操作 基于空间相对导航的机器人操作系统(SLAM) 自适应机器人…

全网惟一面向软件测试人员的Python基础教程-在Python中如何对列表进行增删改排序?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

IB成绩可以申请英国大学吗?

我们都知道ALEVEL课程是英国正统的高中课程&#xff0c;几乎被所有英国学校作为大学招收新生的入学课程。 那么&#xff0c;IB课程作为与ALEVEL课程一样享受极高国际知名度的课程&#xff0c;是否也能够申请英国大学呢&#xff1f;可以确定的告诉大家&#xff0c;用IB课程申请英…

高压放大器的组成部分有哪些(功率放大器的性能好坏)

虽然很多电子工程师经常使用高压放大器&#xff0c;但是对于高压功率放大器的组成和使用都不太清楚&#xff0c;下面来介绍一下高压放大器的组成部分以及如何验证功率放大器的性能好坏。 一、高压放大器的介绍 高压放大器是一种理想的功率放大器&#xff0c;可以放大交流和直流…

[C语言]和我一起来认识“整型在内存中的存储”

目录 1.整型类型中的成员 2.整型在内存中的存储 2.1原码&#xff0c;反码&#xff0c;补码 2.2整型在内存中以补码存放数据 2.3大小端 2.3.1大小端的介绍 2.3.2通过编程判别当前机器的字节序 1.整型类型中的成员 (unsigned为无符号类型&#xff0c;signed为有符号类型) 1.c…

【java集合】HashMap源码解析(基于JDK1.8)

一、Hashmap简介 类继承关系图如下&#xff1a; HashMap实现了三个接口&#xff0c;一个抽象类。主要的方法都在Map接口中&#xff0c;AbstractMap抽象类实现了Map方法中的公共方法&#xff0c;例如&#xff1a;size(),containsKey(),clear()等,主要方法由子类自己实现。 Ha…

Linux驱动之系统移植----uboot移植_修改网络驱动(uboot无设备树版本)

uboot版本:uboot.2016.03 开发板:100ask_imx6ull_pro 修改网络驱动 须知 I.MX6UL/ULL内部有个以太网 MAC外设&#xff0c;也就是 ENET&#xff0c;需要外接一个 PHY芯片来实现网络通信功能&#xff0c;也就是内部 MAC外部 PHY芯片的方案。(一个MAC可对应N个PHY芯片, PHY有地址…

5G NR标准 第11章 多天线传输

第11章 多天线传输 多天线传输是 NR 的关键组成部分&#xff0c;尤其是在较高频率下。 本章一般性地介绍了多天线传输的背景&#xff0c;然后详细描述了 NR 多天线预编码。 11.1 简介 使用多个天线进行传输和/或接收可以在移动通信系统中提供巨大的好处。 发射机和/或接收…

女友:不跟我解释清楚 Linux I/O 晚上你就睡沙发吧

目录阻塞 I/O非阻塞 I/OI/O复用信号驱动 I/O异步 I/O总结I/O 其实就是 input 和 output&#xff08;输入输出&#xff09; 在计算机操作系统中对应数据流的输入与输出&#xff0c;在 Linux 中&#xff0c;既有文件的 I/O&#xff0c;也有网络 I/O 无论是文件 I/O 还是网络 I/…

【大厂高频真题100题】《整数转罗马数字》 真题练习第21题 持续更新~

整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列…