一起玩转算法面试,保姆级攻略(附高清无码算法总结导图),建议收藏

601 阅读14分钟

本文已收录至启舰的电子书《逆天改命—程序员的成神之路》,github地址:github.com/harvic/Figh… 欢迎star。点击【阅读原文】也可直达。

我大学时候也很傻,为了校招,看了不下于五本算法书,加上LeetCode,刷了大半年。

总共一两千道题啊……不刷怕考到……忘了刷,刷了忘……毛都快掉没了……

现在工作近十年,辗转几个大厂,由当年的应试者变成了出题人,才知道,完全不必这么辛苦。

任何事情都遵循28原则,我们只要把握住那20%,就能拿到80分!

凡事都讲究性价比!

省下来的时间,谈个女朋友,它不香么???!!!

这里把我这些年的出题经验告诉大家,希望大家知道哪些是重点,应该怎么学数据结构和算法。

直接上干货,我花了两天的时间做了一张图,涵盖数据结构和算法书籍中都会讲到的知识点。并给出了常用算法的平均时间复杂度,对于必须要学的内容前面加了星标

这里面涉及到了近二十种数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;超四十种常见算法思想:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。

算法导图及推荐学习资料

长文预警,以下内容涵盖了十几年来学习算法的心得,总结出来供大家参考。

文章写了很久,我相信它一定能帮到你,也希望大家能给我个赞,以示鼓励,谢谢

目录:

  1. 数据结构与算法的区别

  2. 数据结构怎么学

  3. 怎么学习算法

  4. 算法太难懂?那是你不知道这些模拟网站

一、数据结构与算法的区别

很多同学搞不明白,数据结构与算法有什么区别,甚至有些同学以为数据结构中就包含了算法。

其实,是字面意思就能知道个大概,数据结构主要讲解数据的组织形式,换句话说,我就是我们要怎样把这些数据存储起来,所以有列表、堆、栈、树、图,这是数据结构的重点。

算法,则注重的是思想,比如列表里的元素怎么排序、怎么在当前的存储结构中找到最大的数和最小的数?等等,说白了就是解决现实中问题的思想。所以才会有分治思想、贪心思想、动态规划这些经典算法。

二、数据结构怎么学

关于数据结构,我想说的是,它是这四大件中最简单、最基础的一个。离开了数据结构,几乎任何的程序都会失效,所以在讨论数据结构的时候,常常要把算法也连带着说一说。

要单纯地掌握常见的数据结构,就如同拆解一个个精妙的仪器件一样有趣和简单。正因为数据结构这个东西在程序中的作用,和仪器部件特别相像,不同的数据结构有着不同的特性,因此要想学好数据结构,图解是必备武器!

这里强推中国大学上,浙江大学的开设的《数据结构》课程,涵盖了常用的数据结构和算法。

www.icourse163.org/course/ZJU-…

辅以教材参考书,强推《大话数据结构》,光看封面你就知道这本书的风格了

没错,这就是大名鼎鼎的《大话设计模式》的作者出的,绝对顶。

三、怎么学习算法

算法课常常和数据结构课放在一起,在有些高校中,会存在“数据结构与算法”和“算法设计与分析”这样的两门课。

学习算法的套路很简单,多看、多写、多上机,既然是思想的集合,看得多了,自然无师自通。

至于刷题,很多同学都知道要刷LeetCode。

LeetCode题库:(2123题)

leetcode-cn.com/problemset/…

总共两千多道题,而且有些题,非常难,就算每天10题,也至少刷半年。这显然不适合绝大部分同学。

所以,我们要找到最核心、最重要的题集,即可

比如,如果时间紧张,可以先刷《程序员面试宝典》里的题目,总共109题。

leetcode-cn.com/problem-lis…

刷完以后,有时候,可以再刷《剑指offer》的题目,共75题。

leetcode-cn.com/problem-lis…

因为这两本书,都是面向面试的高频题汇总,自然有很多题目是重合的。这也正能说明这两本书的重要性。

如果专攻面试的话,还有两本不错的书推荐:

《编程珠玑》这本书的豆瓣评分非常高,有 9 分。

这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。

《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。

当然,我也有一本谷歌师兄总结的高频面试算法习题集,包含了常见的数据结构和算法汇总,无论是排版还是内容,都是非常棒。

所有这些书和开篇的思维导图,我都为大家准备好了,需要的小伙伴可以到备用号上直接领取。

算法导图及推荐学习资料下载

四、算法太难懂?那是你不知道有这些模拟网站

算法的难点在于,根本没办法在脑子里抽象出它的步骤啊

对于做个几何题都费劲的男孩子来说,那更是要了他的亲命了。

今天,我就给大家推荐几个算法可视化的网站。

没错,就是写了代码以后,可以看见他们是怎么一步步求出结果的。

1、visualgo.net/en

目前网站支持中文,印尼文,日文等多语言版本。

最关键的是,它几乎包含了所有算法!!!!

在搜索选项中你可以根据关键词查找到你想要的算法。

点进去一个具体的算法之后,会有两种方式的可视化呈现方式,一种是电子讲座模式,一种是示例模式。其中示例模式是以动画方式呈现,你可以控制动画的快进与倒退,电子讲座模式是以知识点讲解模式呈现,你可以手动控制页面的进度。两种方式都可以帮助你演示每个步骤的过程代码。

接下来我们演示一下冒泡排序的执行过程,如下图所示:

另外,你还可以创建一组自定义的数,然后让动画显示“你的算法”。

除此之外,还支持在线测试哟~

2、algorithm-visualizer.org/Algorithm

在Algorithm Visualizer,大家可以很清楚的看到算法运行的整个过程,很直观,便于大家学习。

大家可以很清楚的看到,网站分为三部分,最左边是算法目录,大家可以选择自己感兴趣的算法,目前已经包括了很多算法了,比如二叉树、图、排序算法、动态规划等等经典算法 。中间区域主要是算法演示以及运行log。右侧是代码以及算法运行按钮。

我们用它来演示一下冒泡排序的执行过程,如下图所示:

同时它是开源的,目前有35K个star,足以可见该项目的欢迎程度,这里推荐给要学习算法的各位。

github.com/algorithm-v…

3、www.cs.usfca.edu/~galles/vis…

目前已经有很多常用的数据结构与算法的可视化,如:常见的数组、链表、队列、二叉搜索树、红黑树、各种排序等,如下图所示:

比如,我们用它来模拟一个二叉搜索树,如下图所示:

我们再用它来演示一下快速排序算法,如下图所示:

五、提升上机能力,还得靠Online Judge系统

现在校招都是在线考试,都会要求直接写可运行的代码。

有些同学正是没有上机经验,连怎么提交都不懂。更别说如何使自己设计的程序符合各种预先设定好的测试用例了。而能通过多久测试用例,却是能得多少分的关键。

所以,提前能先用考试用的上机系统演练下,找下感觉是非常有必要的。

现在已经有很多开放的判题系统了,这里为大家收集了几十不同类型的OJ网址,大家有机会的话,可以看看。

1、本人强推的几个

北京大学POJ poj.org/

中国最受欢迎OJ之一,各式各样各种难度的题目都有。

杭州电子科技大学HDUOJ acm.hdu.edu.cn/

中国最受欢迎OJ之一,题目数量多,来源广。

UVA uva.onlinejudge.org/

全球最大最老牌的OJ之一,题目数量堪称之最。浏览需要FQ。

codeVs codevs.com/

当今最大中文OJ之一,它的天梯功能可以让选手按照难易程度练习各种算法。codevs也是我最早接触到的OJ,题库丰富,难度适中,可以无条件 查看当前出错点的答案。据悉网站管理员WPH95以后想把CODEVS向AI等方面扩宽发展。具体怎样不得而知,不过它作为OJ的强大行还是毋庸置疑的。

洛谷 www.luogu.org/

OJ上的后起新秀,迅速占有了很大的OJ评测份额,它的试炼场功能和CODEVS的天梯功能相同,可以让选手按阶段做题提高。个人认为题目难度分类 有些不太恰当,为何同是“普及+提高-”的题目难度差异那么大呢?支持在线IDE编程。

其代码公开计划可以让提交此题并达到60分且同加入代码公开计划的 人查看他人的代码。

大视野在线评测BZOJ www.lydsy.com/JudgeOnline…

题目难度多为省选级及以上,但有一部分题目需要购买权限才能访问。

UOJ uoj.ac/

举办NOIP难度的UER和省选难度的UR。赛题质量极高,命题人大多为现役集训队选手。

清橙评测tsinsen www.tsinsen.com/

集训队作业网站。近几年的内容还没有公开。

ACdream acdream.info/

2、学院型OJ

湖南师大附中 vijos vijos.org/

学军中学OJ www.hzxjhs.com:83/

河南实验中学OJcojs.tk/cogs/index.…

南阳理工学院OJacm.nyist.net/JudgeOnline…

北大在线评测openjudge.cn/

好像是许多大学创办比赛提交作业的场所。随着2015年NOI网站公布了NOIP考试将从本网站的NOI题库小组抽取题目后,详细这个网站会迎来很多OIERS的访问。

八一中学码酷www.marcool.net/home/index.… 浙江大学ZOJ acm.zju.edu.cn/onlinejudge…

西南科技大学SWUST OJ acm.swust.edu.cn/

(只供校内学生注册)

建兰中学OJschool.jloj.cn/oj-plus/

天津大学OJacm.tju.edu.cn/toj/

TIMUS OJ acm.timus.ru/

南开大学OJacm.nankai.edu.cn/

华中科技大学OJacm.hust.edu.cn/

齐齐哈尔大学OJwww.smartoj.com/

浙江工业大学OJ

acm.zjut.edu.cn/system/mess…

萨拉托夫州立大学OJacm.sgu.ru/

福州大学acm.fzu.edu.cn/

电子科技大学acm.uestc.edu.cn/#/

上海交大OJacm.sjtu.edu.cn/OnlineJudge…

中科大OJacm.ustc.edu.cn/ustcoj/

宁波工程学院ac.2333.moe/

北京师范大学acm.bnu.edu.cn/v3/

3、自由型OJ

九度OJac.jobdu.com/problemset.…

RQNOJ www.rqnoj.cn/

RQNOJ,是国内OJ(信息学在线测评)开放平台开发和运行的先导

tyvj tyvj.cn/

主要面向信息学竞赛,09年成立,现在好像在清北学堂的手中。(话说那大犇出没神马的我们去北京清北的时候挂上去的,现在居然还没撤下来)

4、比赛类OJ/社区型OJ/其他的国外OJ

cf codeforces.com/

Codeforces是一家为计算机编程爱好者提供在线评测系统的俄罗斯网站。该网站由萨拉托夫国立大学的一个团体创立并负责运营。 tc www.topcoder.com/tc

topcoder社区得到了数百万编码者的支持,因此你可以了解到很多挑战性的项目,基于此你还可以为自己赚去额外的报酬。你可以每天或每周参与编码挑战,该社区提供的项目极具有挑战性,对于初学者而言有一定的难度,但却值得一试。

cc www.codechef.com/

CodeChef由Directi创建的一个开发者社区,为开发者提供实践、竞赛和进步的平台。该社区拥有大量的编码竞赛问题,允许访问此前别人解答编码挑战赛的源码。该社区也设置了难易度,你可以根据自身条件选择挑战。

Bestcoder

bestcoder.acmcoder.com/

克罗地亚coci

hsin.hr/coci/

波兰MAIN

main.edu.pl/en

波兰SPOJ

www.spoj.com/

日本JOI

www.ioi-jp.org/index.html

LIGHTOJ www.lightoj.com/login_main.…

AOJ judge.u-aizu.ac.jp/onlinejudge…

5、挑战型OJ

欧拉计划PE projecteuler.net/ Project Euler可能是全球最流行的编程挑战网站,项目推出初期就拥有几十万的用户,足以表明其影响力有多大。Project Euler致力于鼓励、挑战并且发展解题技巧,并为那些对迷人的数学世界有兴趣的人提供乐趣。

leetcode.com/

leetcode 是一个美国的在线编程网站,上面主要收集了各大IT公司的笔试面试题,对于应届毕业生找工作是一个不可多得的好帮手。

这个网站的的好处在于它会告诉你测试数据以及你的输出和正确的输出是什么,方便大家调试学习。目前,只支持C++和Java两种语言。

www.hackerrank.com/

HackerRank网站是为编码程序员们提供一个以编码谜题和现实生活中遇到的编码难题为基础的新兴的社交平台。HackerRank公司得到了风险投资公司Y Combinator 的资金支持。

在这个社区中,他们提供了各种编码谜题、游戏病毒和现实中的编码难题及挑战,让黑客们在该社区中进行交流讨论,接受挑战。HackerRank就如这个名字所暗示的一样,它同时还提供了在线排行榜和其他的竞争元素。

6、学习型OJ

萌码oj.mengma.com/

计蒜客www.jisuanke.com/

内容看起来很多,其实也只是推荐了几本书和一套视频罢了,所列出的这些网站,都只是辅助学习用的。

把这些内容学会,算法应该说是非常牢固了,无论是校招还是工作,都已经非常够用了。

好了,这篇文章就到这了,希望大家都能如愿学会算法。

我是启舰,不要让未来的你,讨厌现在的自己,一起加油。

帮我点个赞吧,谢谢。