一亩三分地

 找回密码 注册账号

扫描二维码登录本站

微信公众号
扫码关注公众号
留学申请公众号
扫码关注留学申请公众号
楼主: 胖头龙
收起左侧

[其他] 胖头龙的咸鱼刷题笔记-算法篇

    [复制链接] |只看干货 |刷题
我的人缘0

升级   20.43%

 楼主| 胖头龙 2020-11-7 11:33:34 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   100% (209)
 
 
0% (0)    👎

第三章 刷题方法

基本思路

作为小白刚入门的时候,第一反应以为所谓刷500题就是把 LeetCode 上面前500题都做一遍;再后来有些经验了意识到刷一遍是不够的,基本做了就忘记了,所以需要刷5遍,也就是500 x 5的由来。

这样也对,也不对。

对于大部分资质平均水平的同学而言,刷题确实需要反复训练领悟,但是反复训练不代表死板的暴力重复。当然,暴力重复确实会有作用,但是有系统、有方法的学习,一般来说会更有效率。

就像背单词一样,每个单词花5分钟读300遍未必是最好办法,间隔多天的反复学习反而效果会更好,因为我们需要尊重大脑的工作方式和记忆方式。

所以坐着不但强调刷题要分类,分重点,同时也要分阶段使用不同的方法,实现螺旋形上升的学习过程。

简单的说,就是新手状态只需要囫囵吞枣,不求甚解;稍微有些经验之后再深入思考,恍然大悟;重点题目都基本理解之后再扩展范围,反复训练;最后在不断的、轻重结合的反复训练中实现融会贯通,能做能说。

也就是相比于简单粗暴的依次刷题,循序渐进的循环刷题效率可能更高。

以下图为例,就是越核心的题目重复的次数越多,掌握的程度越深,熟练度也越高。




从刷题频次上来看,更接近于 30 * 10 + 100 * 8 + 300 * 5 。

这样不仅学习效果更好,对于面试准备也更友善。
因为即便你只处于第二层境界的状态,也已经拥有了相对完整的知识体系,可以应付一些要求不那么高的面试。




刷题模式

刚才提到轻重结合就是指刷题力度不同,这个概念在序言里面已经提到过,这里再重复一下(稍作修改)不同刷题模式:

初刷:
新手期遇到新题,如果短时间内(五分钟)没有思路没关系,不要死缠烂打,早点看答案。
找到最优的答案并尽力去理解,用自己的面试语言和规范的代码风格进行“抄写”,不完全懂也没关系,标注一下,以后再看。
每题时长控制在半小时之内。

精刷:
针对初刷过还未充分理解的题。
尽量全面理解答案的要义,并且至少在能自己“默写”出来,并调试通过。
将解题思路和形成的标准答案加入到笔记当中。
如果实在不能完全领悟,需要在笔记中用显著符号标注该题,写下困惑的地方,过一段时间再试试看。
每题时长控制在一小时之内。

复刷:
针对做过的题进行复习。
自言自语clarify题意,讲请楚自己的思路,写题,检查,跑case,争取bug free一遍过。
只有参考笔记和标准答案复盘自己的错误和不足。
每题时长控制在20分钟内。

回顾:
按照笔记的标签(比如按分类,或者按优先级)大量复习题目。
针对做过的题进行复习,如果对这一题还有映象,则在大脑中过一遍解题思路及实现中的细节要点。
如不记得,则进行主动思考寻求解法,之后对比之前的答案和笔记,看是否正确。
如果不正确则需要强化思考并记忆,不需要写题。
每题时长控制在5-10分钟内。

讲题:
在对此题解题思路正确的情况下,尝试在白板上画图并讲解自己的解题思路,看是否能够流畅完成此过程。
找到一个让自己满意的描述方式,将图表和讲题思路/要点加入到笔记当中。

模拟:
抽取一道新题,看能不能做到复刷中的效果目标。
把题目记入笔记。
每题时长控制在30分钟内。


刷题过程

每个人都可以根据自己的情况定制具体计划,这里给一个例子,是一个对于新手相对详细全面的螺旋型学习过程,可以根据自己的状态进行步骤的增减。
其中必背题大约30道,核心题大约100+,重点题大约200-300道。

(1)基本知识学习
要刷题首先得学会语言,新手起步一般是 Python 或者 Java。(当然刷题语言用什么这又是个引战无数的问题,没必要展开,因为各有优劣,所以自己爱用啥用啥,反正面试官一般都看得懂。作者自己一开始用的Java后来转用Python,因为一般来说大部分算法题的情况下 Python 会相对短一些,面试的时候省一些时间。)

语言学习需要理解这种语言的基本数据结构(Array, Linked List, Set, Map等等)、逻辑操作(if,else, for, while, continue,break, return 等等),然后再学习一些稍微复杂一些的数据结构(Stack, Queue, Tree, Heap等等),以及一些简单的 OOD 知识,比如关于Class的最基本的概念。

一般来说很多网站都有详细或者简单的教程。建议从简单好玩可互动的入门级教程开始上手,然后再去读相对复杂枯燥的讲解,最后也可以适当做一些入门题,就是Lintcode上Naive标签的题(LeetCode好像没有这个难度),熟悉一下最基本的写代码的感觉。

目标:知道if语句,for循环怎么写,基本数据的增删改查知道怎么处理。

(2)初刷必背+核心
分类学习各算法分类的基本概念和思路,以初刷模式刷一遍必备+核心题目(30 + 100左右)。
其中概念和思路要做到基本理解,但是题目一时半会无法完全理解很正常,把题号+题目+参考答案 按照第二章说的方式记在笔记里即可,刷题记录可以标记为深红(尚未理解)。

目标:知道算法大概有哪些门类,题目大概长什么样,都是在问些什么,总结100+题的答案,并收录在笔记里。

(3)精刷必背题
按分类尝试深入理解每个分类下面的必背题。
对于核心题可以按照初刷的方式再过一遍,看不懂就跳过。

目标:基本理解了必背题的解题思路。

(4)精刷核心题
尝试默写出必背题,对核心题使用精刷操作。

目标:能够基本写出必背题的答案,基本理解核心题的解题思路。(第一层境界

(5)初刷重点题
按照分类对重点题使用初刷模式。
每道题自己先思考几分钟,有思路就先自己试一试,没思路就看答案,不管是否成功写对,最后都要找到标准答案。

目标:把重点题过一遍,至少知道前400题长什么样。

(6)复刷必背+核心
继续熟练默写必背题,并尝试讲题,包括clarify,描述思路,过一些test case。
尝试自己写出核心题。

目标:能都随手写出必背题;碰到核心题,都能有思路,虽然可能有小问题,但基本都能写出来。(第二层境界

(7)精刷重点题 + 回顾必背、核心题
按照高频顺序(不再是分类)精刷重点题,如果觉得比较费时间,就从前往后刷到哪是哪。
同时回顾(过题)必备题和核心题,做过时间的比较久的重点题也可以放在回顾计划中。回顾时主要关注思路和实现要点、易错点。

目标:对于前300 ~ 400题形成相对完整的知识体系、笔记体系。

(8)复刷必背、核心题 + 回顾重点题
做到必背、核心题基本都能一次写对,尝试讲题。

目标: 能秒杀核心题。

(9)复刷重点题 + 回顾所有做过的题
如果重点题能直接做出来(可能只是一小部分),就对照一下之前的答案对比一下小的细节差异,如果五分钟没有思路,或者三十分钟没写对,直接看之前笔记的答案修正问题。

目标:对于重点题,也基本看到就都有思路。

(10)回顾所有做过的题 + 模拟
按频率或者面经,以模拟的形式尝试还没做过的题。
包括clarify,解法描述,写题,跑case等等。
不管有没有做对,都要看答案形成笔记。

目标:对于必背、核心题都可以秒杀并详细讲解;对于重点题可以在没有太大逻辑错误的情况下写对;对于400道以外的题目也做过一些,并且看到大部分新题都至少有思路。(第三层境界

(10 +)回顾旧题 + 做新题
进入了一个开放性的成长阶段,面试能用到的理论体系已经完整建立,主流高频题都能搞定。
通过各种新题磨炼自己的临场技能,补充知识体系中的细节。

目标:前往第四层境界的路上。



刷题计划表

也可以定制一个自己的刷题计划表(不同于刷题记录表),方便计划和打卡。

一般来说,刷题这样的高脑力活动,一天4~6个小时效率会比较高。

超出的时间做一些知识学习、回顾旧题这样相对较轻松的任务会比较合适。

如果经常无法按时完成,需要及时调整。

注意劳逸结合。大脑和肌肉一样,练多了效率会降低,特别是对于二十多岁的中老年人。

把每天有限的心力及时用在最困难的任务上。




一些重复三遍的小建议:

学不明白不是你的错,是题目确实难

不要和某一题死磕太久

劳逸结合

能讲和能写一样重要;但是在会讲题之前,得先会写;会写之前,得先理解

按照现在的市场价格,学会一题相当于赚 $500,而且是每年

过程是艰难的,结果是美好的



到这里,前三章的基本方法和思路就差不多讲完了。
第四章开始总结分类列表。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册账号

x

评分

参与人数 8大米 +14 收起 理由
火喵喵 + 2 给你点个赞!
北辰一 + 2 很有用的信息!
kinki23x + 3 给你点个赞!
EasonY + 2 很有用的信息!催更题目分类~
Pharaoh + 1 很有用的信息!催更楼主哈哈哈
xiaohaoZZZ + 2 给你点个赞!
eeeenchanted + 1 感谢!期待更新!
zflynet + 1 感谢楼主更新!期待分类

查看全部评分

回复

使用道具 举报

我的人缘0

升级   0%

zflynet 2020-11-7 11:47:04 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   0% (0)
 
 
0% (0)    👎
胖头龙 发表于 2020-11-7 11:33
第三章 刷题方法

基本思路
感谢楼主更新!期待分类
回复

使用道具 举报

我的人缘0

升级   86%

zyou327 2020-11-9 23:52:09 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (11)
 
 
0% (0)    👎
期待分类+1 zszszszszs
回复

使用道具 举报

我的人缘0

升级   21%

mereyct 2020-11-10 04:11:41 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   90% (512)
 
 
9% (52)    👎
写的也太好了。。我想哭了  感谢。
回复

使用道具 举报

我的人缘0

升级   5.5%

本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   87% (7)
 
 
12% (1)    👎
khart 发表于 2020-10-23 19:13:52
要是能把题号给出来就好了!尤其是必背那30道。
的确要是有题号就好了,虽然这有点伸手党了
回复

使用道具 举报

我的人缘0

升级   13.14%

Pharaoh 2020-11-10 15:36:49 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (179)
 
 
5% (10)    👎
楼主太厉害了!支持,等一波题号!!
回复

使用道具 举报

我的人缘0

升级   20.43%

 楼主| 胖头龙 2020-11-16 07:59:25 | 显示全部楼层
本楼: 👍   100% (3)
 
 
0% (0)   👎
全局: 👍   100% (209)
 
 
0% (0)    👎

第四章 程序基础


从本章开始,将按分类分享题目列表和优先级。
优先级用不同颜色标注:必背:紫色核心:蓝色重点:绿色普通:黄色
另外对于必背和核心题,题目本身的难度级别反而不重要(不管简单还是难你都得会),所有就不标注了。

至于题目的答案,因为作者自己的题解未必是最好的,还希望大家在网上学习总结出适合自己的模板。
LeetCode的Solution和discussion以及中文网站的各种博客已经足够查找到需要的所有信息了。

另外也会针对每类问题列出一些比较重要的问题,供大家在自学中有一个大致的方向。



Python 基本入门的网站(现在基本都用Python3):

W3schools:
这个自带iteractive的在线编译器,比较方便。
https://www.w3schools.com/python/

Tutorialspoint :
这个也差不多,没有编译器。
https://www.tutorialspoint.com/python/index.htm

官方文档:
用来查询API的用法,很实用。
https://docs.python.org/3/

Google 代码风格规范:
一开始会看不明白,几十题之后再回来读,然后自觉向规范靠拢。
https://google.github.io/styleguide/pyguide.html



基本问题:
(1)变量,基本数据类型,逻辑运算符号
(2)控制语句,if else
(3)循环结构,for, while, continue, break
(4)基本数据操作,int,float和常用的数学运算,不同数据类型之间的转换
(5)基本数据结构,理解hashmap,set,tree,  linked list的概念,理解Python 中 string,list,tuple,dict, set,linked list的增删改查
(6)高级数据结构,Counter, defaultdict, OrderedDict, queue, deque, stack, heap, bisect的概念和在python中的用法
(7)其他常见方法,sort, enumerate, map, filter, lambda
(8)函数的使用,参数的传递,引用的传递,递归的基本概念
(9)基本的面向对象,Class, Object,理解引用,deep copy的概念,通过自定义__lt__,  __gt__, __eq__来控制数据结构的排序。


语法入门题目列表:
因为Leetcode没太多基础的题,所以这个章节基本用的是Lintcode上的Naive。
这些题主要是帮助熟悉语法,所以没有用特别高的优先级。

Lint-37. Reverse 3-digit Integer
https://www.lintcode.com/problem ... integer/description

Lint-214. Max of Array
https://www.lintcode.com/problem/max-of-array/description

Lint-283. Max of 3 Numbers
https://www.lintcode.com/problem/max-of-3-numbers/description


Lint-146. Lower to uppercase II
https://www.lintcode.com/problem ... case-ii/description

Lint-241. String to Integer
https://www.lintcode.com/problem/string-to-integer/description

Lint-449. Char to Integer
https://www.lintcode.com/problem/char-to-integer/description


Lint-463. Sort Integers
https://www.lintcode.com/problem/sort-integers/description

Lint-484. Swap Two Intergers in Array
https://www.lintcode.com/problem ... n-array/description

Lint-485. Generate ArrayList with Given Size
https://www.lintcode.com/problem ... en-size/description


Lint-225. Find Node in Linked List
https://www.lintcode.com/problem ... ed-list/description

Lint-466. Count Linked List Nodes
https://www.lintcode.com/problem ... t-nodes/description

Lint-483. Convert Linked List to Array List
https://www.lintcode.com/problem ... ay-list/description


Lint-454. Rectangle Area
https://www.lintcode.com/problem/rectangle-area/description

Lint-478. Simple Calculator
https://www.lintcode.com/problem/simple-calculator/description

Lint-366. Fibonacci
https://www.lintcode.com/problem/fibonacci/description

Lint-632. Binary Tree Maximum Node
https://www.lintcode.com/problem ... um-node/description


Lint-40. Implement Queue by Two Stacks
https://www.lintcode.com/problem ... -stacks/description

Lint-492. Implement Queue by Linked List
https://www.lintcode.com/problem ... ed-list/description

Lint-494. Implement Stack by Two Queues
https://www.lintcode.com/problem ... -queues/description

Lint-495. Implement Stack
https://www.lintcode.com/problem/implement-stack/description



评分

参与人数 3大米 +7 收起 理由
xiaohaoZZZ + 2 不懂为何"收听TA"没用,应该发一篇加一.
kinki23x + 3 给你点个赞!
EasonY + 2 谢楼主更新!

查看全部评分

回复

使用道具 举报

我的人缘0

升级   20.43%

 楼主| 胖头龙 2020-11-16 08:20:55 | 显示全部楼层
本楼: 👍   100% (2)
 
 
0% (0)   👎
全局: 👍   100% (209)
 
 
0% (0)    👎

第五章 二分法


基本问题:
(1)基本思想?(有序的数据,每次通过判断逻辑排除掉一部分的答案,直到触发终止条件)
(2)二分法实现模板(可以递归,可以迭代;一般以迭代为主)
(3)移动两个指针(start与end)的含义?移动条件是什么(筛选掉一部分数据的依据)?循环的截止条件?
(4)数据中是否有重复数字?对结果有什么影响?
(5)为什么你选择的模板中使用start < end 或者 start <= end 或者 start + 1 < end 作为终止条件?这样写是如何避免死循环的?不这么写在什么情况下会出现死循环?
(6)在处理逻辑中,当前结果>, <, = 目标值时分别如何处理?移动指针的依据是什么?
(7)循环退出后是否需要额外处理?
(8)如果遇到corner case根本没进主循环,你的代码是否能正常工作?
(9)为什么Java需要写 mid = start + (end - start) / 2 而 Python可以直接写 mid = (start + end) // 2 ?
(10)如何理解从基本的朴素二分,到相对复杂的条件二分,到更加抽象的答案二分?(在一个显性有序数组中一次砍掉一部分 -->  在一组有规律的数据上利用判断条件逐步缩小范围  -->  在一个有序的抽象模型里,利用不断的"猜测+检验"逐步逼近最终结果)



二分法题目列表:
必背:紫色核心:蓝色重点:绿色普通:黄色;默认是LeetCode,如果是LintCode会以Lint开头)


朴素二分法:

704. Binary Search
https://leetcode.com/problems/binary-search/

34. Find First and Last Position of Element in Sorted Array
https://leetcode.com/problems/fi ... nt-in-sorted-array/

702. Search in a Sorted Array of Unknown Size
https://leetcode.com/problems/se ... ay-of-unknown-size/

153. Find Minimum in Rotated Sorted Array
https://leetcode.com/problems/fi ... tated-sorted-array/

154. Find Minimum in Rotated Sorted Array II
https://leetcode.com/problems/fi ... ed-sorted-array-ii/

278. First Bad Version
https://leetcode.com/problems/first-bad-version/

658. Find K Closest Elements
https://leetcode.com/problems/find-k-closest-elements/


条件二分法:

33. Search in Rotated Sorted Array
(81. Search in Rotated Sorted Array II, follow up)
https://leetcode.com/problems/search-in-rotated-sorted-array/
https://leetcode.com/problems/search-in-rotated-sorted-array-ii/

4. Median of Two Sorted Arrays
https://leetcode.com/problems/median-of-two-sorted-arrays/

74. Search a 2D Matrix
https://leetcode.com/problems/search-a-2d-matrix/

162. Find Peak Element
https://leetcode.com/problems/find-peak-element/

302. Smallest Rectangle Enclosing Black Pixels
https://leetcode.com/problems/sm ... osing-black-pixels/

852. Peak Index in a Mountain Array
https://leetcode.com/problems/peak-index-in-a-mountain-array/


答案二分法:

875. Koko Eating Bananas
https://leetcode.com/problems/koko-eating-bananas/

1283. Find the Smallest Divisor Given a Threshold
https://leetcode.com/problems/fi ... -given-a-threshold/

69. Sqrt(x)
(Lint-586. Sqrt(x) II, follow up)
https://leetcode.com/problems/sqrtx/
https://www.lintcode.com/problem/sqrtx-ii/description

Lint-183. Wood Cut
https://www.lintcode.com/problem/wood-cut/description

Lint-437. Copy Books
https://www.lintcode.com/problem/copy-books/description

Lint-438. Copy Books II
https://www.lintcode.com/problem/copy-books-ii/description


评分

参与人数 6大米 +12 收起 理由
zeroreh + 2 给你点个赞!
火喵喵 + 2 很有用的信息!
xiaohaoZZZ + 2 给你点个赞!
kinki23x + 3 给你点个赞!
EasonY + 2 很有用的信息!
grewan222 + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

我的人缘0

升级   20%

本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   0% (0)
 
 
0% (0)    👎
神人,无私奉献😂😂😂
回复

使用道具 举报

我的人缘0

升级   86%

zyou327 2020-11-16 23:54:43 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (11)
 
 
0% (0)    👎
蹲到更新 日常打卡
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■拉群请前往同学同事飞友|拉群结伴版块,其他版块拉群,帖子会被自动删除
■论坛不能删帖,为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://tools.1point3acres.com/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版|||一亩三分地

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

Some icons made by Freepik from flaticon.com

快速回复 返回顶部 返回列表