From 57326a9bfd63f0c97be66ee9d220b76015a27030 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 3 Jul 2021 17:24:49 +0800 Subject: [PATCH] Update --- README.md | 2 + problems/0020.有效的括号.md | 53 ++++--------------- problems/0225.用队列实现栈.md | 29 +++++----- ...除字符串中的所有相邻重复项.md | 13 +++-- 4 files changed, 35 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 60aa4fd5..2c462a52 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,8 @@ * 编程语言 * [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP) +* 项目 + * [基于跳表的轻量级KV存储引擎](https://github.com/youngyangyang04/Skiplist-CPP) * 编程素养 * [看了这么多代码,谈一谈代码风格!](./problems/前序/代码风格.md) diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md index dae84354..178bc6f8 100644 --- a/problems/0020.有效的括号.md +++ b/problems/0020.有效的括号.md @@ -22,24 +22,24 @@ https://leetcode-cn.com/problems/valid-parentheses/ * 注意空字符串可被认为是有效字符串。 示例 1: -输入: "()" -输出: true +* 输入: "()" +* 输出: true 示例 2: -输入: "()[]{}" -输出: true +* 输入: "()[]{}" +* 输出: true 示例 3: -输入: "(]" -输出: false +* 输入: "(]" +* 输出: false 示例 4: -输入: "([)]" -输出: false +* 输入: "([)]" +* 输出: false 示例 5: -输入: "{[]}" -输出: true +* 输入: "{[]}" +* 输出: true # 思路 @@ -90,7 +90,7 @@ cd a/b/c/../../ 动画如下: -![20.有效括号](https://code-thinking.cdn.bcebos.com/gifs/20.%E6%9C%89%E6%95%88%E6%8B%AC%E5%8F%B7.gif) +![20.有效括号](https://code-thinking.cdn.bcebos.com/gifs/20.有效括号.gif) 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false @@ -130,10 +130,6 @@ public: 技巧性的东西没有固定的学习方法,还是要多看多练,自己总灵活运用了。 - - - - ## 其他语言版本 @@ -162,33 +158,6 @@ class Solution { return deque.isEmpty(); } } -// 方法2 -class Solution { - public boolean isValid(String s) { - - Stack stack = new Stack<>(); - Map map = new HashMap() { - { - put('}', '{'); - put(']', '['); - put(')', '('); - } - }; - - for (Character c : s.toCharArray()) { // 顺序读取字符 - if (!stack.isEmpty() && map.containsKey(c)) { // 是右括号 && 栈不为空 - if (stack.peek() == map.get(c)) { // 取其对应的左括号直接和栈顶比 - stack.pop(); // 相同则抵消,出栈 - } else { - return false; // 不同则直接返回 - } - } else { - stack.push(c); // 左括号,直接入栈 - } - } - return stack.isEmpty(); // 看左右是否抵消完 - } -} ``` Python: diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md index 055c2e3d..85b981e5 100644 --- a/problems/0225.用队列实现栈.md +++ b/problems/0225.用队列实现栈.md @@ -34,7 +34,7 @@ https://leetcode-cn.com/problems/implement-stack-using-queues/ 有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!** -刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://mp.weixin.qq.com/s/P6tupDwRFi6Ay-L7DT4NVg)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行! +刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://mp.weixin.qq.com/s/Cj6R0qu8rFA7Et9V_ZMjCA)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行! **队列模拟栈,其实一个队列就够了**,那么我们先说一说两个队列来实现栈的思路。 @@ -46,18 +46,21 @@ https://leetcode-cn.com/problems/implement-stack-using-queues/ 如下面动画所示,**用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用**,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。 -模拟的队列执行语句如下: -queue.push(1); -queue.push(2); -queue.pop(); // 注意弹出的操作 -queue.push(3); -queue.push(4); -queue.pop(); // 注意弹出的操作 -queue.pop(); -queue.pop(); -queue.empty(); +模拟的队列执行语句如下: -![225.用队列实现栈](https://code-thinking.cdn.bcebos.com/gifs/225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.gif) +``` +queue.push(1); +queue.push(2); +queue.pop(); // 注意弹出的操作 +queue.push(3); +queue.push(4); +queue.pop(); // 注意弹出的操作 +queue.pop(); +queue.pop(); +queue.empty(); +``` + +![225.用队列实现栈](https://code-thinking.cdn.bcebos.com/gifs/225.用队列实现栈.gif) 详细如代码注释所示: @@ -152,7 +155,7 @@ public: }; ``` -## 其他语言版本 +# 其他语言版本 Java: diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md index 760a0946..c6a49376 100644 --- a/problems/1047.删除字符串中的所有相邻重复项.md +++ b/problems/1047.删除字符串中的所有相邻重复项.md @@ -23,15 +23,14 @@ https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/ 示例: -输入:"abbaca" -输出:"ca" -解释: -例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。 +* 输入:"abbaca" +* 输出:"ca" +* 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。   提示: -1 <= S.length <= 20000 -S 仅由小写英文字母组成。 +* 1 <= S.length <= 20000 +* S 仅由小写英文字母组成。 # 思路 @@ -64,7 +63,7 @@ S 仅由小写英文字母组成。 如动画所示: -![1047.删除字符串中的所有相邻重复项](https://code-thinking.cdn.bcebos.com/gifs/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.gif) +![1047.删除字符串中的所有相邻重复项](https://code-thinking.cdn.bcebos.com/gifs/1047.删除字符串中的所有相邻重复项.gif) 从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒叙的,所以在对字符串进行反转一下,就得到了最终的结果。