|
1 | 1 | ## 题目地址 |
2 | 2 | https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/ |
3 | 3 |
|
4 | | -## 思路 |
| 4 | +> 遇到对字符串或者数组做填充或删除的操作时,都要想想从后向前操作怎么样。 |
5 | 5 |
|
6 | | -如果想把这道题目做到极致,就不要只用额外的辅助空间,先扩充数组到每个空格替换成"%20"之后的大小 |
7 | | -然后从后向前替换空格,双指针法: |
| 6 | +# 题目:剑指Offer 05.替换空格 |
8 | 7 |
|
9 | | -思路如下: |
10 | | -<video src="../video/替换空格.mp4" controls="controls" width="640" height="320" autoplay="autoplay"> |
11 | | -Your browser does not support the video tag. |
12 | | -</video> |
| 8 | +请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 |
13 | 9 |
|
14 | | -时间复杂度,空间复杂度均超过100%的用户 |
| 10 | +示例 1: |
| 11 | +输入:s = "We are happy." |
| 12 | +输出:"We%20are%20happy." |
| 13 | + |
| 14 | +# 思路 |
| 15 | + |
| 16 | +如果想把这道题目做到极致,就不要只用额外的辅助空间了! |
| 17 | + |
| 18 | +首先扩充数组到每个空格替换成"%20"之后的大小。 |
| 19 | + |
| 20 | +然后从后向前替换空格,也就是双指针法,过程如下: |
| 21 | + |
| 22 | +i指向新长度的末尾,j指向旧长度的末尾。 |
| 23 | + |
| 24 | +<img src='../video/替换空格.gif' width=600> </img></div> |
| 25 | + |
| 26 | +有同学问了,为什么要从后向前填充,从前向后填充不行么? |
| 27 | + |
| 28 | +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 |
| 29 | + |
| 30 | +**其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** |
| 31 | + |
| 32 | +这么做有两个好处: |
| 33 | + |
| 34 | +1. 不用申请新数组。 |
| 35 | +2. 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。 |
| 36 | + |
| 37 | +时间复杂度,空间复杂度均超过100%的用户。 |
15 | 38 |
|
16 | 39 | <img src='../pics/剑指Offer05.替换空格.png' width=600> </img></div> |
17 | 40 |
|
18 | 41 | ## C++代码 |
19 | 42 |
|
20 | | - |
21 | 43 | ``` |
22 | 44 | class Solution { |
23 | 45 | public: |
@@ -48,5 +70,50 @@ public: |
48 | 70 | }; |
49 | 71 |
|
50 | 72 | ``` |
51 | | -> 更过算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 |
| 73 | +时间复杂度:O(n) |
| 74 | +空间复杂度:O(1) |
| 75 | + |
| 76 | +此时算上本题,我们已经做了七道双指针相关的题目了分别是: |
| 77 | + |
| 78 | +* [27.移除元素](https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA) |
| 79 | +* [15.三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A) |
| 80 | +* [18.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g) |
| 81 | +* [206.翻转链表](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg) |
| 82 | +* [142.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA) |
| 83 | +* [344.反转字符串](https://mp.weixin.qq.com/s/X02S61WCYiCEhaik6VUpFA) |
| 84 | + |
| 85 | +# 拓展 |
| 86 | + |
| 87 | +这里也给大家拓展一下字符串和数组有什么差别, |
| 88 | + |
| 89 | +字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。 |
| 90 | + |
| 91 | +在C语言中,把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。 |
| 92 | + |
| 93 | +例如这段代码: |
| 94 | + |
| 95 | +``` |
| 96 | +char a[5] = "asd"; |
| 97 | +for (int i = 0; a[i] != '\0'; i++) { |
| 98 | +} |
| 99 | +``` |
| 100 | + |
| 101 | +在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用'\0'来判断是否结束。 |
| 102 | + |
| 103 | +例如这段代码: |
| 104 | + |
| 105 | +``` |
| 106 | +string a = "asd"; |
| 107 | +for (int i = 0; i < a.size(); i++) { |
| 108 | +} |
| 109 | +``` |
| 110 | + |
| 111 | +那么vector< char > 和 string 又有什么区别呢? |
| 112 | + |
| 113 | +其实在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。 |
| 114 | + |
| 115 | +所以想处理字符串,我们还是会定义一个string类型。 |
| 116 | + |
| 117 | + |
| 118 | +> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 |
52 | 119 |
|
0 commit comments