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

​力扣:LCR 122. 路径加密​ 题目:剑指Offer 05.替换空格(c++)

本文章代码以c++为例!

力扣:LCR 122. 路径加密

题目:

代码:

class Solution {
public:string pathEncryption(string path) {for(int i=0;i<path.size();i++){if(path[i]=='.'){path[i]=' ';}}return path;}
};

难度升级(原题目)

题目:剑指Offer 05.替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."

# 思路

如果想把这道题目做到极致,就不要只用额外的辅助空间了!

首先扩充数组到每个空格替换成"%20"之后的大小。

然后从后向前替换空格,也就是双指针法,过程如下:

i指向新长度的末尾,j指向旧长度的末尾。

替换空格

有同学问了,为什么要从后向前填充,从前向后填充不行么?

从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。

其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

时间复杂度,空间复杂度均超过100%的用户。

C++代码如下:

class Solution {
public:string replaceSpace(string s) {int count = 0; // 统计空格的个数int sOldSize = s.size();for (int i = 0; i < s.size(); i++) {if (s[i] == ' ') {count++;}}// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小s.resize(s.size() + count * 2);int sNewSize = s.size();// 从后先前将空格替换为"%20"for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {if (s[j] != ' ') {s[i] = s[j];} else {s[i] = '0';s[i - 1] = '2';s[i - 2] = '%';i -= 2;}}return s;}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

拓展

这里也给大家拓展一下字符串和数组有什么差别,

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。

在C语言中,把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。

例如这段代码:

char a[5] = "asd";
for (int i = 0; a[i] != '\0'; i++) {
}

在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用'\0'来判断是否结束。

例如这段代码:

string a = "asd";
for (int i = 0; i < a.size(); i++) {
}

那么vector< char > 和 string 又有什么区别呢?

其实在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。

所以想处理字符串,我们还是会定义一个string类型。

http://www.lryc.cn/news/190582.html

相关文章:

  • cJson堆内存释放问题
  • 论文阅读/写作扫盲
  • 一文拿捏对象内存布局及JMM(JAVA内存模型)
  • Android组件通信——ActivityGroup(二十五)
  • js的继承的方式
  • 聊聊HttpClient的重试机制
  • 北邮22级信通院数电:Verilog-FPGA(4)第三周实验:按键消抖、呼吸灯、流水灯 操作流程注意事项
  • Ghidra101再入门(上?)-Ghidra架构介绍
  • Vue3路由引入报错解决:无法找到模块“xxx.vue”的声明文件 xxx隐式拥有 “any“ 类型。
  • 基于若依ruoyi-nbcio支持flowable流程分类里增加流程应用类型
  • JS之同步异步promise、async、await
  • 【OpenCV • c++】自定义直方图 | 灰度直方图均衡 | 彩色直方图均衡
  • el-tree目录和el-table实现搜索定位高亮方法
  • linux常用指令
  • C语言,指针的一些运算
  • iPhone 如何强制重启
  • 数据结构--单链表操作
  • AlmaLinux (兼容centos)安装Geant4与ROOT
  • FPGA面试题(2)
  • 【C++ Primer Plus学习记录】指针——使用new来创建动态数组
  • 移动app广告变现,对接广告联盟还是选择第三方聚合广告平台?
  • ARM 按键控制 LED灯,蜂鸣器,风扇
  • VirtualBox Ubuntu扩展虚拟机磁盘空间
  • C#开发的OpenRA游戏之电力系统之二
  • Java架构师基础框架设计
  • tortoise创建本地仓库
  • 【FreeRTOS】【STM32】03 FreeRTOSConfig.h头文件简介与修改
  • VScode商店无法访问
  • 【UnityUGUI】复合控件详解,你还记得多少
  • ubuntu下使用gcc编译c程序: “error: stray ‘\357’ in program“