diff --git a/README.md b/README.md index 24ef765b..b0bece57 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ * [数组:这个循环可以转懵很多人!](https://mp.weixin.qq.com/s/KTPhaeqxbMK9CxHUUgFDmg) * [数组:总结篇](https://mp.weixin.qq.com/s/LIfQFRJBH5ENTZpvixHEmg) * [字符串:这道题目,使用库函数一行代码搞定](https://mp.weixin.qq.com/s/X02S61WCYiCEhaik6VUpFA) +* [字符串:简单的反转还不够!](https://mp.weixin.qq.com/s/XGSk1GyPWhfqj2g7Cb1Vgw) * 精选链表相关的面试题 * 精选字符串相关的面试题 * 精选栈与队列相关的面试题 @@ -108,7 +109,7 @@ * [0026.删除排序数组中的重复项](https://github.com/youngyangyang04/leetcode/blob/master/problems/0026.删除排序数组中的重复项.md) * [0206.翻转链表](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg) * [0142.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA) - * [0344.反转字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0344.反转字符串.md) + * [0344.反转字符串](https://mp.weixin.qq.com/s/X02S61WCYiCEhaik6VUpFA) * [剑指Offer05.替换空格](https://github.com/youngyangyang04/leetcode/blob/master/problems/剑指Offer05.替换空格.md) * 栈与队列经典题目 diff --git a/problems/0486.预测赢家.md b/problems/0486.预测赢家.md index 0cbc0752..7b0e083c 100644 --- a/problems/0486.预测赢家.md +++ b/problems/0486.预测赢家.md @@ -237,7 +237,7 @@ for (int i = 0; i < nums.size(); i++) { 接下来就要推导公式了,首先要知道最终求是dp[0][nums.size() - 1]是否大于等于0,也就是求dp[0][nums.size() - 1] 至关重要。 -从下图中,可以看出在推导方程的时候一定要从右上角向下推导,而且矩阵左半部分根本不用管! +从下图中,可以看出在推导方程的时候一定要从右下角向上推导,而且矩阵左半部分根本不用管! diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index 9a9e6a79..e30d18f1 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -3,7 +3,7 @@ https://leetcode-cn.com/problems/keys-and-rooms/ ## 思路 -其实这道题的本质就是判断各个房间所连成的有向图,是否存在孤岛,如果有孤岛,说明不用访问所有的房间。 +其实这道题的本质就是判断各个房间所连成的有向图,说明不用访问所有的房间。 如图所示: @@ -13,7 +13,7 @@ https://leetcode-cn.com/problems/keys-and-rooms/ 示例2中,就不能访问所有房间,从图中就可以看出,房间2是一个孤岛,我们从0出发,无论怎么遍历,都访问不到房间2。 -认清本质问题之后,**就知道孤岛问题,使用 广度优先搜索(BFS) 还是 深度优先搜索(DFS) 都是可以的。** +认清本质问题之后,**使用 广度优先搜索(BFS) 还是 深度优先搜索(DFS) 都是可以的。** 代码如下: diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index 7b99b42a..129044d5 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -1,23 +1,45 @@ ## 题目地址 https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/ -## 思路 +> 遇到对字符串或者数组做填充或删除的操作时,都要想想从后向前操作怎么样。 -如果想把这道题目做到极致,就不要只用额外的辅助空间,先扩充数组到每个空格替换成"%20"之后的大小 -然后从后向前替换空格,双指针法: +# 题目:剑指Offer 05.替换空格 -思路如下: - +请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 -时间复杂度,空间复杂度均超过100%的用户 +示例 1: +输入:s = "We are happy." +输出:"We%20are%20happy." + +# 思路 + +如果想把这道题目做到极致,就不要只用额外的辅助空间了! + +首先扩充数组到每个空格替换成"%20"之后的大小。 + +然后从后向前替换空格,也就是双指针法,过程如下: + +i指向新长度的末尾,j指向旧长度的末尾。 + + + +有同学问了,为什么要从后向前填充,从前向后填充不行么? + +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 + +**其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** + +这么做有两个好处: + +1. 不用申请新数组。 +2. 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。 + +时间复杂度,空间复杂度均超过100%的用户。 ## C++代码 - ``` class Solution { public: @@ -48,5 +70,50 @@ public: }; ``` -> 更过算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 +时间复杂度:O(n) +空间复杂度:O(1) + +此时算上本题,我们已经做了七道双指针相关的题目了分别是: + +* [27.移除元素](https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA) +* [15.三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A) +* [18.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g) +* [206.翻转链表](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg) +* [142.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA) +* [344.反转字符串](https://mp.weixin.qq.com/s/X02S61WCYiCEhaik6VUpFA) + +# 拓展 + +这里也给大家拓展一下字符串和数组有什么差别, + +字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说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类型。 + + +> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 diff --git a/video/替换空格.gif b/video/替换空格.gif new file mode 100644 index 00000000..c98dae4f Binary files /dev/null and b/video/替换空格.gif differ