前言
有一天,有个人在Twitter上提问:
@maozhu1: @xiaolai 还请李老师用140字概括一下怎样才能学好英语?
我回复说:
其实一个字就够了:“用”。
这本书里的文字,全部的意义,只有两个字:“启发”。
有些知识,不仅要了解,还要深入了解。为了深入了解,不仅要学习,还要实践,更要反复试错,在成功中获得激励,在失败中汲取教训,路漫漫其修远,上下求索才可能修成正果。小到开车,大到创业,各种所需要的知识莫不如是。面对这样的知识,我们要了解
What──它究竟是什么?
Why──为什么它是那个样子?
How──要掌握它、应用它,必须得遵循什么样的步骤?
然而,有另外一种知识,往往还是格外重要的知识,在知道它的那一瞬间就可能开始发挥重大的作用,甚至,在知道它(What)的那一瞬间,它所有的重大作用全部都发挥完毕(至于 Why 和 How,甚至可能在了解它的 What 那一瞬间早已经不言自明)。
在我个人的记忆里,一路上遇到过很多这种 “只要知道就能够瞬间全部发挥作用” 的知识。学概率统计的时候,遇到 “独立事件” 这个概念,就是这类知识的典型例子。在此之前,我很自然地以为如果连续 9 次抛硬币都是正面朝上,那么第 10 次抛出硬币之后正面朝上的可能性要远远低于背面朝上的可能性 …… 在概率教科书里读到 “独立事件” 的那一瞬间,让我意识到之前的想法是多么的可笑。因为抛硬币正反面的几率是永远都相同的(硬币出现正反面在每次抛时都是相互独立、不受之前结果影响的),各占 50%,所以即便我抛一百次,一万次,甚至更多次都是正面朝上,下一次抛正反面的几率也还是如此,各占 50%。
至此,这个知识的所有作用已经全部发挥完毕:它能够彻头彻尾地改变一些人──那些一不小心看到它实际意义的人。无论是谁,在做几乎所有决定的时候,都要考虑 “可能性”(学称 “概率”)。在我不知道 “独立事件” 这个概念之前所做出的很多决定,换在知道 “独立事件” 这个概念之后,我是无论如何都不会那样选择的──这就是改变,并且是质变。
另一个令我记忆深刻的例子是很小的时候学习编程语言。多年以来,受影响最深的,并不是当时所学的 BASIC,或者是后来所学的 PASCAL,抑或再后来学的 C、C++什么的;受影响最深的是一种思考方式──在运行程序之前,要反复浏览代码,在脑子里进行预演;而不是写完程序直接运行,出错了再说。这是节省时间提高效率的重要方式。刚开始并不知道 “了解了这种操作方式” 给自己带来了多大的影响;可是,许多年之后,观察到身边大多数人从来都没有 “做事之前先在脑子里预演” 的习惯,才明白很小的时候知道了那样的做法给自己带来的巨大好处──并且是没办法给那些不知道的人讲明白的好处。(也许正因为如此,才总是有人这样无奈罢:会的人,自然会了,不会的人,无论如何也不会。) 更为关键的是,这种知识的获取,是 “不可逆的”。在你知道它的那一瞬间,它就已经改变了一切,你的生活因它而变,再也无法复原。我们再也不可能对这种知识视而不见,听而不闻,置之不理,它瞬间就能根深蒂固,无法铲除。比如,真正理解概率统计常识的人,是绝对不会去买彩票的 …… 因为买彩票这种行为在他们眼里相当于不尊重自己的智商和已学过的知识。可与此同时,彩票是地球上最畅销的商品,可见有多少人一生都未曾有机会了解那些重要的知识。
当然,读到这里,读者都会同意:也许最值得传播的(至少应该为之努力的)就是这种知识。传播它们的最大意义,甚至唯一的意义和目的,就是 “启发”。这本书里的文字,全部的意义,只有两个字:“启发”。作者真诚地希望读者在读过这些文字之后,(起码)在英语使用方面有所启发。
也许有些读者会发现里面有 “太多的废话”,那仅仅是因为这类知识的特性:它们太 “貌不惊人”,如果非要它们以本来的面目出现,他们是不会注意到的──无论它们实际上有多么重要。否则,他们早就被这类知识彻头彻尾地改变了 …… 可事实上他们不还是原来那个样子么?
也许有些读者自然而然地依照思维惯性,希望看到更多的 “How”。可正如之前所解释的那样,这类知识中的大多数,读者在了解到 “What” 的那一瞬间,它的作用就已经全部发挥完毕,“Why” 也许只不过是多余的解释,而 “How” 或者不言自明,或者因人而异,需要读者自己摸索……
这类知识注定属于少数人。除了之前已经说过的原因之外,还有另外一个重要的原因:人们只愿传播自己相信的知识──哪怕那所谓的知识根本就是错的。重要的不是对错,重要的是感觉。尽管 “觉得正确” 和 “正确” 相差可能十万八千里,但对大多数人来说根本就是一回事儿,起码,他们情愿那就是一回事儿。所以,容易传递的是那些 “很自然地就令人相信(感觉)是正确的”,而不是 “事实上正确的” 事情。
前些年我写《把时间当作朋友》的时候,多少对它的传播是悲观的,因为我知道那些文字里所传递的绝大多数是这种道理、这类知识──它们的本质决定了其传播的困难程度。所以,那时候,我觉得只要有零星那么几个人能够被那些文字所改变,就已经万幸了。互联网时代充满了奇迹,那些文字在网上以每个月几万点击的数量被浏览。而 2009 年印刷成书出版后,竟然可以在一年之内重印 11 次,再次出乎我的意料。哪怕真正接受那些道理的读者比率再低,由于基数巨大,我知道我还是结结实实地改变了很多人的。
正是这样的动力,使我甘心、耐心地写下这本书里的文字。知道它们无论如何都会再次改变一些人──尽管我自己永远没办法知道最终改变的究竟是哪些人。生活中充满了无奈,然而有些人幸运如我,毕竟能够改变点什么。于是,那些无奈,那些不幸,就多少淡了一些。
事实上,这本书也是《把时间当做朋友》的具体延续。《把时间当做朋友》的主旨很简单:时间不会听从我们的管理,我们最多只能与时间做朋友;与时间做朋友的方法只不过是 “用正确的方式做正确的事情”。而这本书,只不过是 把 “正确的事情” 聚焦在 “用英语” 上而已,而后再看看可能的 “正确的方式” 究竟是什么。
李笑来
2010 年春于上海初稿
2010 年冬于北京修改
2015 年于北京重新制作网络开放版本
2019 年于北京上传至 Github
labuladong 的算法小抄labuladong 的算法小抄
labuladong/fucking-algorithm: 刷算法全靠套路,认准 labuladong 就够了!English version supported! Crack LeetCode, not only how, but also why. (github.com)
https://github.com/labuladong/fucking-algorithm
labuladong 的算法小抄labuladong 的算法小抄
好消息,《labuladong 的算法小抄》纸质书出版啦!关注公众号查看详情
本仓库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌,后面有目录。
我先吐槽几句。刷题刷题,刷的是题,培养的是思维,本仓库的目的就是传递这种算法思维。我要是只写一个包含 LeetCode 题目代码的仓库,有个锤子用?没有思路解释,没有思维框架,顶多写个时间复杂度,那玩意一眼就能看出来。
只想要答案的话很容易,题目评论区五花八门的答案,动不动就秀 python 一行代码解决,有那么多人点赞。问题是,你去做算法题,是去学习编程语言的奇技淫巧的,还是学习算法思维的呢?你的快乐,到底源自复制别人的一行代码通过测试,已完成题目 +1,还是源自自己通过逻辑推理和算法框架不看答案写出解法?
网上总有大佬喷我,说我写的东西太基础,要么说不能借助框架思维来学习算法。我只能说大家刷算法就是找工作吃饭的,不是打竞赛的,我也是一路摸爬滚打过来的,我们要的是清楚明白有所得,不是故弄玄虚无所指。
不想办法做到通俗易懂,难道要上来先把《算法导论》吹上天,然后把人家都心怀敬仰地劝退?
做啥事情做多了,都能发现套路的,我把各种算法套路框架总结出来,相信可以帮助其他人少走弯路。我这个纯靠自学的小童鞋,花了一年时间刷题和总结,自己写了一份算法小抄,后面有目录,这里就不废话了。
使用方法
1、先给本仓库点个 star,满足一下我的虚荣心,文章质量绝对值你一个 star。我还在继续创作,给我一点继续写文的动力,感谢。
2、建议关注我的公众号 labuladong,坚持高质量原创,说是最良心最硬核的技术公众号都不为过。本仓库的文章就是从公众号里整理出来的一部分内容,公众号可以查看更多内容:
3、建议收藏我的在线网站,每篇文章开头都有对应的力扣题目链接,可以边看文章边刷题,一共可以手把手带你刷 300 道题目:
GitHub Pages 地址:labuladong 的算法小抄 :: labuladong的算法小抄
Gitee Pages 地址:labuladong 的算法小抄 :: labuladong的算法小抄
4、我的教程已经制作成了《算法秘籍》和《刷题笔记》两本 PDF 教材,点这里 查看。另外建议关注 我的 B 站,我把一系列核心算法技巧都录制成了视频,方便大家学习。
5、我开发了一系列配套插件辅助大家学习算法,覆盖各个使用场景:
首先是我的 Chrome 刷题插件,方便在网页上刷题的读者,功能如下图:
如果不喜欢在网页刷题,可以安装我的 vscode 刷题插件,功能如下图:
或者,也可以安装我的 JetBrains 刷题插件,功能如下图:
可以说,我把内容和配套工具全都做好了,你只要按部就班顺着我的教程学习,就可以获得沉浸式的学习体验。这是教程及工具链使用手册的入口:
其他的先不多说了,直接上干货吧,我们一起搞定 LeetCode,感受一下支配算法的乐趣。
目录
准备工作:安装刷题全家桶
配套 Chrome 刷题插件
配套 vscode 刷题插件
配套 JetBrains 刷题插件
配套 PDF 算法教材
番外:用算法打败算法
数据结构精品课
二叉树(递归)专题课
学习本站所需的 Java 基础
第零章、核心框架汇总
学习算法和刷题的框架思维
我的刷题心得
双指针技巧秒杀七道链表题目
双指针技巧秒杀七道数组题目
东哥带你刷二叉树(纲领篇)
动态规划解题套路框架
回溯算法解题套路框架
回溯算法秒杀所有排列/组合/子集问题
BFS 算法解题套路框架
我写了首诗,把二分搜索算法变成了默写题
我写了首诗,把滑动窗口算法变成了默写题
一个方法团灭 LeetCode 股票买卖问题
一个方法团灭 LeetCode 打家劫舍问题
一个方法团灭 nSum 问题
算法时空复杂度分析实用指南
算法笔试「骗分」套路
第一章、手把手刷数据结构
手把手刷链表算法
双指针技巧秒杀七道链表题目
递归魔法:反转单链表
如何 K 个一组反转链表
如何判断回文链表
手把手刷数组算法
双指针技巧秒杀七道数组题目
小而美的算法技巧:前缀和数组
小而美的算法技巧:差分数组
二维数组的花式遍历技巧
我写了首诗,把滑动窗口算法算法变成了默写题
滑动窗口算法延伸:Rabin Karp 字符匹配算法
我写了首诗,让你闭着眼睛也能写对二分搜索
带权重的随机选择算法
二分搜索怎么用?我又总结了套路
田忌赛马背后的算法决策
常数时间删除/查找数组中的任意元素
一道数组去重的算法题把我整不会了
手把手刷二叉树算法
东哥带你刷二叉树(纲领篇)
东哥带你刷二叉树(思路篇)
东哥带你刷二叉树(构造篇)
东哥带你刷二叉树(序列化篇)
东哥带你刷二叉树(后序篇)
归并排序详解及应用
东哥带你刷二叉搜索树(特性篇)
东哥带你刷二叉搜索树(基操篇)
东哥带你刷二叉搜索树(构造篇)
快速排序详解及应用
题目不让我干什么,我偏要干什么
Git原理之最近公共祖先
如何计算完全二叉树的节点数
手把手刷图算法
图论基础及遍历算法
环检测及拓扑排序算法
二分图判定算法
并查集(Union-Find)算法
Kruskal 最小生成树算法
Prim 最小生成树算法
Dijkstra 算法模板及应用
众里寻他千百度:名流问题
手把手设计数据结构
算法就像搭乐高:带你手撸 LRU 算法
算法就像搭乐高:带你手撸 LFU 算法
前缀树算法模板秒杀五道算法题
一道求中位数的算法题把我整不会了
单调栈结构解决三道算法题
单调队列结构解决滑动窗口问题
二叉堆详解实现优先级队列
队列实现栈以及栈实现队列
设计朋友圈时间线功能
第二章、手把手刷动态规划
动态规划基本技巧
动态规划解题套路框架
动态规划设计:最长递增子序列
最优子结构原理和 dp 数组遍历方向
base case 和备忘录的初始值怎么定?
动态规划穷举的两种视角
对动态规划进行降维打击
子序列类型问题
经典动态规划:编辑距离
动态规划设计:最长递增子序列
动态规划设计:最大子数组
经典动态规划:最长公共子序列
动态规划之子序列问题解题模板
背包类型问题
经典动态规划:0-1 背包问题
经典动态规划:子集背包问题
经典动态规划:完全背包问题
动态规划和回溯算法到底谁是谁爹?
用动态规划玩游戏
动态规划之最小路径和
动态规划帮我通关了《魔塔》
动态规划帮我通关了《辐射4》
旅游省钱大法:加权最短路径
经典动态规划:正则表达式
经典动态规划:高楼扔鸡蛋
经典动态规划:戳气球
经典动态规划:博弈问题
经典动态规划:四键键盘
一个方法团灭 LeetCode 打家劫舍问题
一个方法团灭 LeetCode 股票买卖问题
贪心类型问题
贪心算法之区间调度问题
扫描线技巧:安排会议室
剪视频剪出一个贪心算法
如何运用贪心思想玩跳跃游戏
第三章、必知必会算法技巧
暴力搜索算法
回溯算法解题套路框架
经典回溯算法:集合划分问题
回溯算法秒杀所有排列/组合/子集问题
一文秒杀所有岛屿题目
回溯算法最佳实践:解数独
回溯算法最佳实践:括号生成
BFS 算法解题套路框架
如何用 BFS 算法秒杀各种智力题
数学运算技巧
谈谈游戏中的随机算法
常用的位操作
讲两道常考的阶乘算法题
如何高效寻找素数
如何高效进行模幂运算
如何同时寻找缺失和重复的元素
一行代码就能解决的算法题
几个反直觉的概率问题
经典面试题
分治算法详解:运算优先级
一个方法解决三道区间问题
谁能想到,斗地主也能玩出算法
烧饼排序算法
字符串乘法计算
如何实现一个计算器
如何高效解决接雨水问题
如何解决括号相关的问题
如何判定完美矩形
如何调度考生的座位
二分查找高效判定子序列
第四章、通用计算机技术
Linux 文件系统都是什么鬼
Linux 的进程/线程/文件描述符是什么
关于 Linux shell 你必须知道的
Linux 管道和重定向的坑
一文看懂 session 和 cookie
加密算法的前身今世
我用四个命令概括了 Git 的所有套路
Git/SQL/正则表达式的在线练习平台
消息队列架构设计演进
存储系统设计之 LSM 树原理
用消息队列制作一款多人在线游戏
学习开源项目,告别 CRUD
如何学习开源项目,我又总结了套路
逆天改命——程序员成神之路
harvic/FightingCoder: 写给程序员的电子书《逆天改命——启舰的100条程序员人生建议》 (github.com)
https://github.com/harvic/FightingCoder
逆天改命——程序员成神之路
大家好,我是启舰
唬人的头衔比较多,我出过两本技术书籍《Android自定义控件入门与实战》、《Android自定义控件高级进阶与精彩实例》,2017度CSDN博客之星,CSDN博客专家,电子工业出版社优秀作家。
现在从业近十年,硕士毕业后进了阿里,现在辗转几个大厂,做了几年的技术主管。
做公众号一年多以来,看到一些同学还在重蹈着我的覆辙。也有些同学,努力的让人心疼,但方向不对,也终是徒劳。
所以,但凡遇到向我提问的同学,我有空的时候,都会细心做答。但毕竟精力有限,在我忙起来的时候,一些提问根本没有精力细细回复。
我尝试把我以前的文章进行归类,希望大家通过检索的方式,在我以前的文章中找到答案。但文章毕竟繁琐冗长,一些问题并没有明确的答案。
我决定把文章重新编纂,把编程领域相关的问题一一作答。
我一直在想,如果在我年轻时拿到这本书,我的人生或许会不一样。但千金难买早知道。我的人生浪费了很多时间,走了很多弯路。
这本书是我近十年所知所会的心血结晶,希望你能够仔细阅读,我觉得它应该能改变很多程序员的命运。
基于此,我给他取了一个带着使命的名字《逆天改命——启舰的100条程序员人生建议》
转存失败重新上传取消
这本书,本是出版社约稿。
目前来讲,出书对我的意义不大,我更想让这本书广泛传播,以帮助更多的同学,所以,我决定以电子书的形式,把这本书分享给大家。
我希望这本书这本书是程序员人生路上的百科宝典,它其中将涉及校招、社招、入门、进阶、笔试、面试、转行、副业、青春饭等等问题,涵盖程序员相关的方方面面。随着人生阅历的增加,我可能会及时增加其中的内容。
本书中所有内容都是我的经验所得,但毕竟个人的经历和眼界都是有限的,如有不对之处,还请不吝赐教。
其实,我也就一普通人,想必看这本书的很多同学,以后都会比我强。
要说我有什么本事,只不过是喜欢总结和分享罢了。
我单纯的只是希望我知道的这点东西能够帮到一些同学,如果有一天,你发现我说的是对的,甚至我真的有帮到你,那这本书的使命就完成了。如果还能再跑回来跟我道声谢,那就真的太让我开心了。
书中所有文字,皆为原创。与版权公司有合作,抄袭必究。
花有重开日,人无再少年。
希望大家都能够珍惜当下,不要让未来的你,讨厌现在的自己。
原创不易,如果有帮到你,请帮我点个star吧,比心,biubiu biu~
二、目录
开篇
大学生篇
1.对计算机专业来说学历真的重要吗?
2.计算机专业有必要考研吗?
3.计算机考研,这样选学校才是正解
4.程序员垃圾简历长什么样?
5.我为什么推荐学Python,但不希望大家用Python找工作?
6.计算机专业如何高质量的走完大学四年?毕业成为Offer收割机
7.程序员是做全栈工程师好?还是专注一个领域好?
8.如何系统地学习计算机编程?自学还是培训?怎么选?
社招篇
1.在中国,程序员前景一片灰暗?
2.计算机基础知识对程序员来说有多重要?
3.在中国程序员是青春饭吗?
4.程序员的五层境界,你在哪一层?最后一层的,都是人生赢家
副业挣钱
1.什么才是创业必胜的真经?
2.在校大学生如何用编程赚钱?|我的大学赚钱之路
3.今年大三,兼职年入六万,方法路径分享
4.读者牛逼!接澳洲的单子,一天600,方法路径分享!
我的故事
1.再见,我考上了!
持续连载中......每周两篇......