当前位置: 首页 > news >正文

【leetcode 力扣刷题】双指针///原地扩充线性表

双指针///原地扩充线性表

  • 剑指 Offer 05. 替换空格
    • 定义一个新字符串
    • 扩充字符串,原地替换
    • 思考

剑指 Offer 05. 替换空格

题目链接:剑指 Offer 05. 替换空格
题目内容:
在这里插入图片描述
这是一道简单题,理解题意,就是将字符串s中的空格‘ ’替换成‘%20’。需要注意:一个空格是一个char,替换成‘%20’是3个char

这里有两种思路:一种是定义一个新的string变量ss,ss是s替换空格后的版本;一种是先扩充s的长度,然后在s上替换空格。

定义一个新字符串

这个方法先定义一个新的字符串ss,需要申请额外的空间。从前往后遍历s的时候,如果s[i] != ‘ ’,ss[j] = s[i],直接复制s的元素;如果s[i] == ‘ ’,那么ss[j]/ss[j+1]/ss[j+2]分别赋值‘%’,‘2’,‘0’,直到遍历完s。
【注意】需要先遍历s,统计s中空格的数量,以确定ss的长度为s.size() + 2 * count
代码如下(C++):

lass Solution {
public:string replaceSpace(string s) {//先统计s中的空格数量int count = 0;for(int i = 0; i < s.size(); i++){if(s[i] == ' ')count++;}//申请新的空间s.size()+2*countstring ss(s.size()+2*count,' ');for(int i = 0, j = 0; i < s.size(); i++){if(s[i] == ' '){ //替换空格ss[j++] = '%';ss[j++] = '2';ss[j++] = '0';}else{ss[j++] = s[i];}}return ss;}
};

扩充字符串,原地替换

上面的方法很容易想到,但是需要额外申请s.size()+2*count的空间。是否有空间复杂度更低的方法呢?
如果将空格替换成其他字符比如’a’,那么可以直接从前往后【从后往前也是可以的】遍历字符串中的每个字符,如果s[i]==‘ ’,就s[i] = ‘a’。这道题可以这么做吗? 答案是不行的。如果是s[i] == ‘ ’后,s[i]和s[i+1]和s[i+2]分别赋值‘%’,‘2’,‘0’,那么本身的s[i+1]/s[i+2]的值就会被覆盖
但是从后往前遍历就可以!先把s长度扩充为替换后的长度s.size() + 2 * count。双指针一个front定位在s原长度的最后一个元素;behind定位在s新长度的最后一个元素。front逐步前移,遍历s中的字符;如果s[front] != ‘ ’→s[behind] = s[front];如果s[front] == ‘ ’→s[behind-2]/s[behind-1]/s[behind]分别赋值‘%’‘2’‘0’。
从后往前遍历,不存在上面提到的s中一些未被遍历的元素被覆盖的情况。 因为front始终是小于等于behind的,而只有behind小于了front才有未遍历元素被覆盖。小于说明front指针前还有空格要替换;等于就说明front前面的元素全都非空格。一开始front在behind前面2 * count个位置,不是空格时,front前移一个,behind也前移一个,两者距离不变;遇到空格时,front前移一个,behind变成了‘%20’后前移三个,两个距离减少2,也就是每替换一个空格behind就向front靠近2个下标位置。因此直到空格替换完,front都在behind前面。而s中只有front前面的元素是没有复制到新s中的,front后面的元素都已经被复制到了s中的新位置,因此不存在没有遍历的元素被覆盖掉的情况。
另外,注意循环条件是front<behind,front=behind相等即说明空格替换完毕。
代码如下(C++):

class Solution {
public:string replaceSpace(string s) {//统计空格数量int count = 0;for(int i = 0; i < s.size(); i++){if(s[i] == ' ')count++;}int original = s.size(); //保留原始长度s.resize(original + 2*count); //resize到新的长度,新增一截//注意循环条件是front<behind,front和behind相等即说明空格替换完毕for(int behind = s.size()-1, front = original -1; front<behind ; front--){if(s[front] == ' '){//替换空格s[behind--] = '0';s[behind--] = '2';s[behind--] = '%';}elses[behind--] = s[front];}return s;}
};

思考

这个题目不仅适用于string,对于其他可变长度的数据结构,比如vector也是可以的。先扩充,再利用双指针原地操作原元素,可以降低空间复杂度。

相关文章:

【leetcode 力扣刷题】双指针///原地扩充线性表

双指针///原地扩充线性表 剑指 Offer 05. 替换空格定义一个新字符串扩充字符串&#xff0c;原地替换思考 剑指 Offer 05. 替换空格 题目链接&#xff1a;剑指 Offer 05. 替换空格 题目内容&#xff1a; 这是一道简单题&#xff0c;理解题意&#xff0c;就是将字符串s中的空格…...

第八章,帖子列表

8.1添加帖子列表 <script> import { mapState } from vuex . . . </script> computed: {...mapState([auth,user,articles]) }, <Message :sh...

netty与websockt实现聊天

配置websockt&#xff1a; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration;/*** websocket配置*/ Data Configuration ConfigurationProperties(prefix &qu…...

21.2 CSS 三大特性与页面布局

1. 开发者工具修改样式 使用开发者工具修改样式, 操作步骤如下: * 1. 打开开发者工具: 在浏览器中右键点击页面, 然后选择检查或者使用快捷键(一般是 F12 或者 CtrlShiftI)来打开开发者工具.* 2. 打开样式编辑器: 在开发者工具中, 找到选项卡或面板, 一般是Elements或者Elemen…...

MySQL 特殊语法时间格式以及Greadb连接

一、时间语法 DATE_FORMAT和to_char() select to_char(now(),%Y-%m-%d %H:%i:%s) from dual; select DATE_FORMAT(now(),%Y-%m-%d %H:%i:%s) from dual; 2.to_date() 和STR_TO_DATE(#{date},%Y-%m-%d ) select to_date(now(),yyyy-mm-dd hh24:mi:ss) from dual;...

Python(.pyc)反编译:pycdc工具安装与使用

本文将介绍如何将python的.pyc文件反编译成源码&#xff0c;以便我们对源码的学习与改进。pycdc工具安装 下载地址&#xff1a; 1、Github地址&#xff1a;https://github.com/zrax/pycdc &#xff0c;下载后需要使用CMake进行编译。 2、已下载好及编译好的地址&#xff1a;ht…...

山西电力市场日前价格预测【2023-08-28】

日前价格预测 预测明日&#xff08;2023-08-28&#xff09;山西电力市场全天平均日前电价为319.70元/MWh。其中&#xff0c;最高日前电价为371.80元/MWh&#xff0c;预计出现在19: 15。最低日前电价为278.59元/MWh&#xff0c;预计出现在13: 00。 价差方向预测 1&#xff1a; …...

python3/pip3 SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

环境&#xff1a; mac os 背景&#xff1a; 电脑之前安装的是python3.9 &#xff0c; 现在升级到python3.10。 从python官网下载macos版本的python3.10 pkg。 双击安装。 程序使用aiohttp访问ebay 。 出错&#xff1a; aiohttp.client_exceptions.ClientConnectorCertifi…...

Python中的迭代器与生成器

文章目录 1、迭代器2、生成器3、列表推导式和生成器表达式4、enumerate() 在Python中&#xff0c;迭代器&#xff08;Iterator&#xff09;和生成器&#xff08;Generator&#xff09;是两种用于处理可迭代对象的重要工具。而可迭代对象包括列表&#xff0c;元组&#xff0c;字…...

简单着色器编写(下)

函数部分介绍完了&#xff0c;最后来介绍一下main函数中的部分。 std::string vertexShader "#version 330 core\n" "\n" "layout(location0)in vec4 position;" "\n" "void main()\n" "{\n&…...

go并发编程基础

go并发编程 1waitgroup WaitGroup就是等待所有的goroutine全部执行完毕&#xff0c;add方式和Down方法要配套使用 package mainimport ("fmt""sync" )func main() {var wq sync.WaitGroupwq.Add(100) //监控多少个goroutine执行结束for i: 0;i<100;…...

PHP之 导入excel表格时,获取日期时间变成浮点数

读取到的时间 float(0.20833333333333) 原格式 15:00:00 代码 if (Request::isPost()) {$file_url input(upfile); // 本地上传文件地址// 读取文件内容$local_file_url __dir__./../../../public.$file_url;// $spreadsheet new Spreadsheet();// $sheet $spreadsheet-…...

学习 Java 报表技术导入 Maven 依赖出错:jacob 无法下载、jasperreports 依赖错误

发生缘由 最近在做一个可视化项目&#xff0c;用到了 Java 报表技术。在跟着「黑马」课程导入 pom.xml 文件的时候提示下载依赖错误。 com.jacob 包无法下载Failed to read artifact descriptor for com.lowagie:itext:jar:2.1.7.js6 运行环境 电脑系统版本&#xff1a;Win…...

力扣-哈希-最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; **输入&#xff1a;**nums [100,4,200,1,3,2] **输出&a…...

Java线程 - 详解(1)

一&#xff0c;创建线程 方法一&#xff1a;继承Thread类 class MyThread extends Thread{Overridepublic void run() {System.out.println("线程1");} }public class Test {public static void main(String[] args) {MyThread myThread new MyThread();myThread.…...

结构体-C语言(初阶)

目录 一、结构体声明 1.1 结构概念 1.2 结构声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 二、结构体成员的访问 2.1 结构体变量访问成员 2.2 结构体指针访问指向变量的成员 三、结构体传参 一、结构体声明 1.1 结构概念 结构是一些值的集合&#xff0c;这些值称为…...

【网络】HTTPS的加密

目录 第一组&#xff0c;非对称加密第二组&#xff0c;非对称加密第三组&#xff0c;对称加密证书签名 HTTPS使用的是非对称加密加对称加密的方案 &#xff08;非对称加密&#xff1a;公钥加/解密&#xff0c;私钥解/加密&#xff09; &#xff08;对称加密&#xff1a;一组对称…...

Nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…...

java-Optional 类详解

目录 前言 Optional的构造方法 Optional的相关方法介绍 isPresent用法&#xff1a; get用法&#xff1a; filter用法&#xff1a; orElse用法&#xff1a; orElseGet用法 orElseThrow用法 map用法 flatMap用法&#xff1a; 前言 Optional 类是java8的新特性&#xff0…...

sql数据库怎么备份,sql 实时备份

在当今互联网时代&#xff0c;数据已经成为企业的核心资产。然而&#xff0c;数据的安全性和完整性面临硬件问题、软件故障、人工操作错误等各种威胁。为了保证数据的安全&#xff0c;实时备份已经成为公司必须采取的重要措施之一。下面我们就重点介绍SQL实时备份的重要实施方法…...

RK3399平台开发系列讲解(存储篇)Linux 存储系统的 I/O 栈

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux 存储系统全景二、Linux 存储系统的缓存沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 存储系统的 I/O 原理。 一、Linux 存储系统全景 我们可以把 Linux 存储系…...

Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南

天猫平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…...

postgresql 条件表达式

postgresql 条件表达式 简单CASE表达式搜索CASE表达式缩写函数nullif函数示例 coalesce函数 总结 简单CASE表达式 语法如下 case 表达式when 值1 then 结果1when 值2 then 结果2else 默认值 end;select e.first_name , e.last_name , case e.department_id when 90 then 管…...

姜启源数学模型第五版第五章火箭发射升空

姜启源数学模型第五版第五章例题内容复现 数学建模背景1.学习内容火箭发射升空理论知识 2.例题3.问题分析不考虑空气阻力的模型考虑空气阻力的模型 4.代码内容复现不考虑空气阻力考虑空气阻力模型 数学建模背景 首先先简单的介绍数学建模是一个怎么样的内容 数学建模是一种将数…...

局域网中电脑共享文件给手机

学习资源&#xff1a; 局域网共享&#xff1a;这样设置&#xff0c;你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果&#xff1f; 连接同一个WIFI&#xff0c;电脑端为服务端&#xff0c;提供共享文件&#xff0c;手机是客户端&#xff0c;可以读取服务端…...

线段树练习

P1198 [JSOI2008] 最大数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) // Problem: P1198 [JSOI2008] 最大数 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P1198 // Memory Limit: 128 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://c…...

Mybatis映射.动态sql.分页

介绍&#xff1a; 动态SQL是MyBatis提供的一种动态生成SQL语句的方式&#xff0c;可以根据不同的条件生成不同的SQL语句&#xff0c;从而实现更加灵活的查询和操作。 在MyBatis的映射文件中&#xff0c;可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL…...

springboot向resources下写文件的两种方式

文章目录 方式一&#xff1a;方式二&#xff1a; 方式一&#xff1a; import java.io.File; import java.io.FileWriter; import java.io.IOException;public class WriterFileUtils {private static final String prefix "classpath:";public static void writeFi…...

Sloare flare网卡信息

详细的安装信息 https://github.com/Xilinx-CNS/onload/tree/master/scripts 进行下载 Solarflare网卡开发&#xff1a;openonload 安装与调试_openonload安装_Erice_s的博客-CSDN博客 cns-sfnettest测试 cns-sfnettest 下载 https://github.com/Xilinx-CNS/cns-sfnettes…...

Redis知识点整理

第一部分&#xff1a;Redis基础知识点 1、数据类型 5种常用基础类型&#xff1a;string,hash,list,set,zset – 字符串&#xff0c;Hash表&#xff0c;List顺序集合&#xff0c;Set无序集合&#xff0c;ZSet有序集合3中特殊类型&#xff1a;bitmap-字节地图, hyperloglog-统计…...

淮安建立公司网站流程/营销案例

NDFI是什么&#xff1f; NDFI被称为归一化退化指数。可以用来表达森林植被的退化程度和森林的健康程度。 NDFI最开始发表的文章是&#xff08;Combining spectral and spatial information to map canopy damage from selective logging and forest fires&#xff09;。该指数…...

具有品牌的做pc端网站/windows优化大师官网

以追加的方式将程序输出到不同的日志文件&#xff0c;当日志文件超过10M大小时&#xff0c;自动清空文件。 package toolsimport ("fmt""log""os" )const logDir string "/usr/local/dbmng/log/"func PathExists(path string) bool {…...

最新国内新闻50条简短/长沙建站seo公司

作者&#xff1a;农民工老王 来源&#xff1a;blog.csdn.net/monarch91/article/details/122709576 我是一个非科班出身的程序员&#xff0c;大学本科时的专业和编程无关&#xff0c;毕业后做了几年事业单位后&#xff0c;才中途转行做了软件开发。 我一入行就听说了35岁危机&…...

深圳建设网站哪家好/推广赚钱的微信小程序

一、了解never类型 ts的文档 在TypeScript中never就是Bottom Type&#xff0c;意味着一个不表示任何类型的类型,never不会是任何值&#xff0c;可能会被推断出来&#xff0c;或者自己定义避免出现逻辑上的异常 比如一个函数中是一个死循环或异常&#xff0c;这个函数则不会返回…...

厦门做网站xm37/网站排名软件有哪些

CentOS下mysql数据库常用命令总结1.更改root密码 mysqladmin -uroot password yourpassword 2.远程登陆mysql服务器 mysql -uroot -p -h192.168.137.10 -P3306 3.查询数据库 show databases; 4.进入某个数据库 use databasename; 5.列出数据库中的表 show tables; 6.查看某个表…...

做网站法律条文/视频推广

1&#xff09;全局变量&#xff1a;其生命周期是永久的&#xff0c;除非主动销毁这个全局变量 2&#xff09;在函数内用var声明的局部变量&#xff1a;它们会随着函数调用的结束而销毁...