提交 d1273c01 编写于 作者: L labuladong

修改 bug

上级 1c32e17a
# 一、前言
我曾经尝试在网上有不少学习算法的资料,但真的让我挺无语,要么就是太零散,要么就是笔记性质别人都看不懂。我这个纯靠自学的小童鞋,花了一年时间自己写一份算法小抄,总共 **60 多篇原创文章**,够通俗,绝不是简单的代码堆砌,下面有目录,质量如何,这里就不废话了。
本仓库总共 60 多篇原创文章,基本上都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到**举一反三,通俗易懂**,绝不是简单的代码堆砌,后面有目录。
我先吐槽几句。**刷题刷题,刷的是题,培养的是思维,本仓库的目的就是传递这种算法思维**。我要是只写一个包含 LeetCode 题目代码的仓库,有个锤子用?没有思路解释,没有思维框架,顶多写个时间复杂度,那玩意一眼就能看出来。
只想要答案的话很容易,题目评论区五花八门的答案,动不动就秀 python 一行代码解决,有那么多人点赞。问题是,你去做算法题,是去学习编程语言的奇技淫巧的,还是学习算法思维的呢?你的快乐,到底源自复制别人的一行代码通过测试,已完成题目 +1,还是源自自己通过逻辑推理和算法框架不看答案写出解法?
网上总有大佬喷我,说我写这玩意太基础了,根本没必要啰嗦。我只能说大家刷算法就是找工作吃饭的,不是打竞赛的,我也是一路摸爬滚打过来的,我们要的是清楚明白有所得,不是故弄玄虚无所指。不想办法做到通俗易懂,难道要上来先把《算法导论》吹上天,然后把人家都心怀敬仰地劝退?别的不说,公众号几万读者,PDF 版本上万次下载,联系我的出版社都好几家,说明质量还过得去吧?
**做啥事情做多了,都能发现套路的,我把各种算法套路框架总结出来,相信可以帮助其他人少走弯路**。我这个纯靠自学的小童鞋,花了一年时间刷题和总结,自己写了一份算法小抄,后面有目录,这里就不废话了。
### 使用方法
1、**先给本仓库点个 star,满足一下我的虚荣心**,文章质量绝对值你一个 star,给我一点继续写文的动力,感谢。
1、**先给本仓库点个 star,满足一下我的虚荣心**,文章质量绝对值你一个 star。我还在继续创作,给我一点继续写文的动力,感谢。
2、可以在我的 gitbook 上直接查看所有文章,会同步持续更新,建议收藏。地址:https://labuladong.gitbook.io/algo
2、可以在我的 gitbook 上直接查看所有文章,会和公众号同步持续更新文章,建议收藏。地址:https://labuladong.gitbook.io/algo
3、可以关注我的公众号 **labuladong**,我就是不喜欢转载乱七八糟的低质文章,**坚持原创,全是高质量原创,说是最良心最硬核的算法公众号都不为过**
3、可以关注我的公众号 **labuladong** 及时获取更新。我不喜欢转载乱七八糟的低质文章,**坚持高质量原创,说是最良心最硬核的技术公众号都不为过**
这些文章就是从公众号里整理出来的,目前主要发文平台是微信公众号,公众号后台回复关键词【电子书】可以获得这份小抄的电子书版本,方便你做笔记:
......@@ -19,14 +27,14 @@
# 二、文章目录
* 第零章、必读系列
* [学习算法和刷题的思路指南](算法思维系列/学习数据结构和算法的高效方法.md)
* [学习算法和刷题的框架思维](算法思维系列/学习数据结构和算法的高效方法.md)
* [学习数据结构和算法读什么书](算法思维系列/为什么推荐算法4.md)
* [动态规划详解](动态规划系列/动态规划详解进阶.md)
* [动态规划解题框架](动态规划系列/动态规划详解进阶.md)
* [动态规划答疑篇](动态规划系列/最优子结构.md)
* [回溯算法详解](算法思维系列/回溯算法详解修订版.md)
* [二分查找详解](算法思维系列/二分查找详解.md)
* [双指针技巧总结](算法思维系列/双指针技巧.md)
* [滑动窗口技巧](算法思维系列/滑动窗口技巧.md)
* [回溯算法解题框架](算法思维系列/回溯算法详解修订版.md)
* [二分查找解题框架](算法思维系列/二分查找详解.md)
* [滑动窗口解题框架](算法思维系列/滑动窗口技巧.md)
* [双指针技巧解题框架](算法思维系列/双指针技巧.md)
* [Linux的进程、线程、文件描述符是什么](技术/linux进程.md)
* [Git/SQL/正则表达式的在线练习平台](技术/在线练习平台.md)
* 第一章、动态规划系列
......
......@@ -65,16 +65,28 @@ PS:不要忘了,Linux 中一切都被抽象成文件,设备也是文件,
明白了这个原理,**输入重定向**就很好理解了,程序想读取数据的时候就会去`files[0]`读取,所以我们只要把`files[0]`指向一个文件,那么程序就会从这个文件中读取数据,而不是从键盘:
![](../pictures/linuxProcess/4.jpg)
```shell
$ command < file.txt
```
![](../pictures/linuxProcess/5.jpg)
同理,**输出重定向**就是把`files[1]`指向一个文件,那么程序的输出就不会写入到显示器,而是写入到这个文件中:
![](../pictures/linuxProcess/5.jpg)
```shell
$ command > file.txt
```
![](../pictures/linuxProcess/4.jpg)
错误重定向也是一样的,就不再赘述。
**管道符**其实也是异曲同工,把一个进程的输出流和另一个进程的输入流接起一条「管道」,数据就在其中传递,不得不说这种设计思想真的很优美:
```shell
$ cmd1 | cmd2 | cmd3
```
![](../pictures/linuxProcess/6.jpg)
到这里,你可能也看出「Linux 中一切皆文件」设计思路的高明了,不管是设备、另一个进程、socket 套接字还是真正的文件,全部都可以读写,统一装进一个简单的`files`数组,进程通过简单的文件描述符访问相应资源,具体细节交于操作系统,有效解耦,优美高效。
......
# 二叉搜索树操作集锦
通过之前的文章[框架思维](../算法思维系列/学习数据结构和算法的框架思维.md),二叉树的遍历框架应该已经印到你的脑子里了,这篇文章就来实操一下,看看框架思维是怎么灵活运用,秒杀一切二叉树问题的。
通过之前的文章[框架思维](../算法思维系列/学习数据结构和算法的高效方法.md),二叉树的遍历框架应该已经印到你的脑子里了,这篇文章就来实操一下,看看框架思维是怎么灵活运用,秒杀一切二叉树问题的。
二叉树算法的设计的总路线:明确一个节点要做的事情,然后剩下的事抛给框架。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册