From aa87376071b0f66897c18f74509a9c899c8ce858 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 21 Jun 2021 10:12:10 +0800 Subject: [PATCH] Update --- README.md | 4 ++ problems/0051.N皇后.md | 8 --- problems/0151.翻转字符串里的单词.md | 63 +++++++------------ problems/0160.相交链表.md | 2 + problems/剑指Offer05.替换空格.md | 32 ++++------ .../剑指Offer58-II.左旋转字符串.md | 35 +++++------ problems/栈与队列理论基础.md | 15 +---- 7 files changed, 60 insertions(+), 99 deletions(-) create mode 100644 problems/0160.相交链表.md diff --git a/README.md b/README.md index daef7c02..b9ee3a9e 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,10 @@ 4. [马上秋招了,慌得很!](https://mp.weixin.qq.com/s/7q7W8Cb2-a5U5atZdOnOFA) 5. [Carl看了上百份简历,总结了这些!](https://mp.weixin.qq.com/s/sJa87MZD28piCOVMFkIbwQ) 6. [面试中遇到了发散性问题.....](https://mp.weixin.qq.com/s/SSonDxi2pjkSVwHNzZswng) +7. [英语到底重不重要!](https://mp.weixin.qq.com/s/1PRZiyF_-TVA-ipwDNjdKw) +8. [计算机专业要不要读研!](https://mp.weixin.qq.com/s/c9v1L3IjqiXtkNH7sOMAdg) +9. [秋招和提前批都越来越提前了....](https://mp.weixin.qq.com/s/SNFiRDx8CKyjhTPlys6ywQ) + ## 数组 diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index 5242fce2..fd2c7d0f 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -353,14 +353,6 @@ class Solution { } ``` -## 其他语言版本 - - -Java: - - -Python: - Go: ```Go diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index d76734e4..e092a717 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -16,19 +16,19 @@ https://leetcode-cn.com/problems/reverse-words-in-a-string/ 给定一个字符串,逐个翻转字符串中的每个单词。 -示例 1: -输入: "the sky is blue" -输出: "blue is sky the" +示例 1: +输入: "the sky is blue" +输出: "blue is sky the" -示例 2: -输入: "  hello world!  " -输出: "world! hello" -解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 +示例 2: +输入: "  hello world!  " +输出: "world! hello" +解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 -示例 3: -输入: "a good   example" -输出: "example good a" -解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 +示例 3: +输入: "a good   example" +输出: "example good a" +解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 # 思路 @@ -50,12 +50,15 @@ https://leetcode-cn.com/problems/reverse-words-in-a-string/ * 将整个字符串反转 * 将每个单词反转 -如动画所示: +举个例子,源字符串为:"the sky is blue " -![151翻转字符串里的单词](https://tva1.sinaimg.cn/large/008eGmZEly1gp0kv5gl4mg30gy0c4nbp.gif) +* 移除多余空格 : "the sky is blue" +* 字符串反转:"eulb si yks eht" +* 单词反转:"blue is sky the" 这样我们就完成了翻转字符串里的单词。 + 思路很明确了,我们说一说代码的实现细节,就拿移除多余空格来说,一些同学会上来写如下代码: ```C++ @@ -80,13 +83,13 @@ void removeExtraSpaces(string& s) { 如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是O(n)的时间复杂度呢。 -想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA),最优的算法来移除元素也要O(n)。 +想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww),最优的算法来移除元素也要O(n)。 erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。 那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。 -如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA)是如何移除元素的。 +如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)是如何移除元素的。 那么使用双指针来移除冗余空格代码如下: fastIndex走的快,slowIndex走的慢,最后slowIndex就标记着移除多余空格后新字符串的长度。 @@ -122,7 +125,7 @@ void removeExtraSpaces(string& s) { 此时我们已经实现了removeExtraSpaces函数来移除冗余空格。 -还做实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[字符串:这道题目,使用库函数一行代码搞定](https://mp.weixin.qq.com/s/X02S61WCYiCEhaik6VUpFA)和[字符串:简单的反转还不够!](https://mp.weixin.qq.com/s/XGSk1GyPWhfqj2g7Cb1Vgw)里已经讲过了。 +还做实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)和[541.反转字符串II](https://mp.weixin.qq.com/s/pzXt6PQ029y7bJ9YZB2mVQ)里已经讲过了。 代码如下: @@ -135,11 +138,8 @@ void reverse(string& s, int start, int end) { } ``` -## 本题C++整体代码 +本题C++整体代码 -效率: - - ```C++ // 版本一 @@ -203,6 +203,7 @@ public: return s; } + // 当然这里的主函数reverseWords写的有一些冗余的,可以精简一些,精简之后的主函数为: /* 主函数简单写法 string reverseWords(string s) { removeExtraSpaces(s); @@ -220,25 +221,8 @@ public: }; ``` -当然这里的主函数reverseWords写的有一些冗余的,可以精简一些,精简之后的主函数为: - -```C++ -// 注意这里仅仅是主函数,其他函数和版本一一致 -string reverseWords(string s) { - removeExtraSpaces(s); - reverse(s, 0, s.size() - 1); - for(int i = 0; i < s.size(); i++) { - int j = i; - // 查找单词间的空格,翻转单词 - while(j < s.size() && s[j] != ' ') j++; - reverse(s, i, j - 1); - i = j; - } - return s; -} -``` - - +效率: + @@ -316,7 +300,6 @@ class Solution { } ``` -Python: Go: diff --git a/problems/0160.相交链表.md b/problems/0160.相交链表.md new file mode 100644 index 00000000..d26f66fd --- /dev/null +++ b/problems/0160.相交链表.md @@ -0,0 +1,2 @@ + +同:[链表:链表相交](./面试题02.07.链表相交.md) diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index a4c0149f..f68d8e22 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -13,9 +13,9 @@ https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/ 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 -示例 1: -输入:s = "We are happy." -输出:"We%20are%20happy." +示例 1: +输入:s = "We are happy." +输出:"We%20are%20happy." # 思路 @@ -42,9 +42,9 @@ i指向新长度的末尾,j指向旧长度的末尾。 时间复杂度,空间复杂度均超过100%的用户。 - + -## C++代码 +C++代码如下: ```C++ class Solution { @@ -76,17 +76,17 @@ public: }; ``` -时间复杂度:O(n) -空间复杂度:O(1) +* 时间复杂度: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) +* [27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww) +* [15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg) +* [18.四数之和](https://mp.weixin.qq.com/s/SBU3THi1Kv6Sar7htqCB2Q) +* [206.翻转链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A) +* [142.环形链表II](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ) +* [344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w) # 拓展 @@ -121,10 +121,6 @@ for (int i = 0; i < a.size(); i++) { 所以想处理字符串,我们还是会定义一个string类型。 - - - - ## 其他语言版本 @@ -150,8 +146,6 @@ public static String replaceSpace(StringBuffer str) { } ``` -Python: - Go: ```go diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md index 39c8382c..70c6f015 100644 --- a/problems/剑指Offer58-II.左旋转字符串.md +++ b/problems/剑指Offer58-II.左旋转字符串.md @@ -16,16 +16,16 @@ https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/ 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 -示例 1: -输入: s = "abcdefg", k = 2 -输出: "cdefgab" +示例 1: +输入: s = "abcdefg", k = 2 +输出: "cdefgab" -示例 2: -输入: s = "lrloseumgh", k = 6 -输出: "umghlrlose" +示例 2: +输入: s = "lrloseumgh", k = 6 +输出: "umghlrlose" -限制: -1 <= k < s.length <= 10000 +限制: +1 <= k < s.length <= 10000 # 思路 @@ -34,7 +34,7 @@ https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/ 不能使用额外空间的话,模拟在本串操作要实现左旋转字符串的功能还是有点困难的。 -那么我们可以想一下上一题目[字符串:花式反转还不够!](https://mp.weixin.qq.com/s/X3qpi2v5RSp08mO-W5Vicw)中讲过,使用整体反转+局部反转就可以实现,反转单词顺序的目的。 +那么我们可以想一下上一题目[字符串:花式反转还不够!](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)中讲过,使用整体反转+局部反转就可以实现,反转单词顺序的目的。 这道题目也非常类似,依然可以通过局部反转+整体反转 达到左旋转的目的。 @@ -50,13 +50,13 @@ https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/ 如图: - + 最终得到左旋2个单元的字符串:cdefgab 思路明确之后,那么代码实现就很简单了 -# C++代码 +C++代码如下: ```C++ class Solution { @@ -73,15 +73,16 @@ public: # 总结 + 此时我们已经反转好多次字符串了,来一起回顾一下吧。 -在这篇文章[字符串:这道题目,使用库函数一行代码搞定](https://mp.weixin.qq.com/s/X02S61WCYiCEhaik6VUpFA),第一次讲到反转一个字符串应该怎么做,使用了双指针法。 +在这篇文章[344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w),第一次讲到反转一个字符串应该怎么做,使用了双指针法。 -然后发现[字符串:简单的反转还不够!](https://mp.weixin.qq.com/s/XGSk1GyPWhfqj2g7Cb1Vgw),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。 +然后发现[541. 反转字符串II](https://mp.weixin.qq.com/s/pzXt6PQ029y7bJ9YZB2mVQ),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。 -后来在[字符串:花式反转还不够!](https://mp.weixin.qq.com/s/X3qpi2v5RSp08mO-W5Vicw)中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。 +后来在[151.翻转字符串里的单词](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。 -最后再讲到本地,本题则是先局部反转再 整体反转,与[字符串:花式反转还不够!](https://mp.weixin.qq.com/s/X3qpi2v5RSp08mO-W5Vicw)类似,但是也是一种新的思路。 +最后再讲到本题,本题则是先局部反转再 整体反转,与[151.翻转字符串里的单词](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)类似,但是也是一种新的思路。 好了,反转字符串一共就介绍到这里,相信大家此时对反转字符串的常见操作已经很了解了。 @@ -93,7 +94,6 @@ public: **如果想让这套题目有意义,就不要申请额外空间。** - ## 其他语言版本 Java: @@ -117,7 +117,6 @@ class Solution { } } ``` -Python: Go: @@ -151,4 +150,4 @@ func reverse(b []byte, left, right int){ * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) * 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) -
\ No newline at end of file +
diff --git a/problems/栈与队列理论基础.md b/problems/栈与队列理论基础.md index 04f99981..db871a3c 100644 --- a/problems/栈与队列理论基础.md +++ b/problems/栈与队列理论基础.md @@ -85,20 +85,7 @@ std::queue> third; // 定义以list为底层容器的队列 所以STL 队列也不被归类为容器,而被归类为container adapter( 容器适配器)。 -我这里讲的都是(clck)C++ 语言中情况, 使用其他语言的同学也要思考栈与队列的底层实现问题, 不要对数据结构的使用浅尝辄止,而要深挖起内部原理,才能夯实基础。 - - - -## 其他语言版本 - - -Java: - - -Python: - - -Go: +我这里讲的都是C++ 语言中情况, 使用其他语言的同学也要思考栈与队列的底层实现问题, 不要对数据结构的使用浅尝辄止,而要深挖起内部原理,才能夯实基础。