Open qiwihui opened 3 years ago
原文地址: https://github.com/jwasham/coding-interview-university 基于2020年10月30日的原文版本翻译和校对
原先我为了成为一个软件工程师而建立这份简单的学习主题清单, 但这份清单随着时间而膨胀成今天这样。在做完这份清单上的每个目标后,我成为了 Amazon 的软件开发工程师! 你或许不需要像我一样学习这么多。但是,让你成为一位称职工程师所需要的知识都在这里了。
我每天自学8~12小时,这样持续了好几个月。这是我的故事:为什么我为了 Google 面试而自学了8个月。
在这份清单内的主题会让你拥有足够的知识去面对几乎每家软件公司的技术面试,包括科技巨头:Amazon、Facebook、Google,以及 Microsoft。
祝你好运!
这是我为了从 web 开发者(自学、非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月。
这份清单适用于 新手软件工程师,或者想从软件/网站开发转向软件工程(需要计算机科学知识)的人员。如果你有多年的经验,并且声称拥有多年的软件工程经验,并且期待一次更艰难的面试。
如果你具有多年的软件/网页开发经验,请注意,大型软件公司(例如 Google,Amazon,Facebook 和 Microsoft)将软件工程视为不同于软件/网页开发,并且它们需要计算机科学知识。
如果你想成为可靠性工程师或运维工程师,请从可选列表(网络,安全)中学习更多。
---------------- 下面的内容是可选的 ----------------
当我开始这个项目时,我不知道堆和栈的区别,不了解时间复杂度(Big-O)、树,或如何去遍历一个图。如果非要我去编写一个排序算法的话,我只能说我所写的肯定是很糟糕。一直以来,我所用的任何数据结构都是内建于编程语言当中。至于它们在背后是如何运作,对此我一概不清楚。此外,以前的我并不需要对内存进行管理,最多就只是在一个正在执行的进程抛出了“内存不足”的错误后,才会去找解决方法。在我的编程生涯中,虽然我有用过多维数组,也用过关联数组成千上万次,但我从来没有自己实现过数据结构。
这是一个漫长的计划,以至于花费了我数月的时间。若你早已熟悉大部分的知识,那么也许能节省大量的时间。
下面所有的东西都只是一个概述。因此,你需要由上而下逐一地去处理它。
在学习过程中,我使用 GitHub 特殊语法的 markdown 去检查计划的进展,包括使用包含任务进度的任务列表。
创建一个新的分支,以便你可以像这样去勾选计划的进展:直接往方括号中填写一个字符 x 即可:[x]。
Fork一个分支,并跟随以下的指令
通过单击 Fork 按钮来 fork GitHub 仓库:jwasham/coding-interview-university
克隆项目到本地
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
在你完成了一些修改后,在框框中打 x
git add .
git commit -m "Marked x"
git rebase jwasham/master
git push --set-upstream origin progress
git push --force
更多关于 Github-flavored markdown 的详情
部分视频只能通过在 Coursera 或者 Edx 课程上注册登录才能观看。这些视频被称为网络公开课程(MOOC)。有时候某些课程需要等待好几个月才能获取,这期间你无法观看这些课程的影片。
很感谢你能帮我把网络公开课程的视频链接转换成公开的,可持续访问的视频源,比如 YouTube 视频,以代替那些在线课程的视频。此外,一些大学的讲座视频也是我所青睐的。
你可以在编程这一环节,使用一种自己用起来较为舒适的语言去完成编程,但对于大公司,你只有三种固定的选择:
你也可以使用下面两种编程语言,但可能会有某些限制,你需要实现查明:
我之前写过一篇关于在面试时选择编程语言的文章:为编程面试选择一种语言。
你需要对你所选择的语言感到非常舒适且足够了解。
更多关于语言选择的阅读:
在此查看相关语言的资源
由于我正在学习C、C++ 和 Python,因此在下面你会看到部分关于它们的学习资料。相关书籍请看文章的底部。
为了节省你的时间,以下是比我使用过的更缩减的书单。
选择以下之一:
你需要选择面试语言(请参见上文)。
这是我按语言给出的建议。我没有所有语言的资源,欢迎贡献。
如果你通读其中之一,你应该具备了开始解决编程问题所需的所有数据结构和算法知识。除非你需要复习,否则你可以跳过此项目中的所有视频讲座。
额外编程语言的精选资源
我没有读过这两本书,但是它们颇受好评,作者是 Sedgewick,他非常厉害。
如果你有更好的 C++ 书籍,请告诉我。我正在搜集全面的资源。
或者:
该列表已经持续更新了很长的一段时间,所以,我们的确很容易会对其失去控制。
这里列出了一些我所犯过的错误,希望你不要重滔覆辙。
就算我观看了数小时的视频,并记录了大量的笔记,几个月后的我,仍然会忘却其中大部分的东西。所以,我花了3天翻阅我的笔记,并制作成抽认卡(flashcard)帮助我复习:
请阅读以下的文章以免重蹈覆辙:
记住计算机科学知识。
有人推荐给我的课程(但我还沒看过):学习如何学习。
为了解决善忘的问题,我制作了一个抽认卡的网页,用于添加两种抽认卡:一般的及带有代码的。每种卡都会有不同的格式设计。
而且,我还以移动设备为先去设计这些网页,以使得在任何地方,我都能通过我的手机及平板去回顾知识。
你也可以免费制作属于你自己的抽认卡网站:
有一点需要记住的是,我做事有点过头,以至于卡片都覆盖到所有的东西上,从汇编语言和 Python 的细枝末节,到机器学习和统计都被覆盖到卡片上。而这种做法,对于要求来说是多余的。
在抽认卡上做笔记: 若你第一次发现你知道问题的答案时,先不要急着把其标注成“已知”。反复复习这张抽认卡,直到每次都能答对后才是真正学会了这个问题。反复地问答可帮助你深刻记住该知识点。
这里有个替代我抽认卡的网站 Anki,很多人向我推荐过它。这个网站用同一个字卡重复出现的方式让你牢牢地记住知识。这个网站非常容易使用,支持多平台,并且有云端同步功能。在 iOS 平台上收费25美金,其他平台免费。
这是我用 Anki 这个网站里的格式所储存的抽认卡资料库: ankiweb.net/shared/info/25173560 (感谢 @xiewenya)
我留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的抽认卡,以便在空余的时候可以学习。
编程累了就休息半个小时,并去复习你的抽认卡。
在学习的过程中,往往会有许多令人分心的事占据着我们宝贵的时间。因此,专注和集中注意力是非常困难的。放点纯音乐能帮上一些忙。
有一些熟悉且普遍的技术在此未被谈及到:
部分问题可能会花费一天的时间去学习,而有些则会花费多天。当然,有些学习并不需要我们懂得如何实现。
因此,每一天我都会在下面所列出的列表中选择一项,并观看相关的视频。然后,使用以下的一种语言去实现:
你不需要学会所有的编程语言,你只需要专注在一种编程语言上。
为何要在这些语言上分别实现一次?
就算我没有时间去每一项都这么做,但我也会尽我所能。
在这里你可以查看到我的代码:
你不需要记住每一个算法的内部原理。
在一个白板上写代码,而不要直接在计算机上编写。在测试完部分简单的输入后,到计算机上再测试一遍。
[ ] 学习C语言
[ ] 计算机是如何处理一段程序:
[ ] 视频:
[ ] 在线课程:
[ ] 使用线性探测的数组去实现
[ ] 笔记:
关于堆排序,请查看前文堆的数据结构部分。堆排序很强大,不过是非稳定排序。
[ ] Sedgewick ── 归并排序(5个视频)
[ ] Sedgewick ── 快速排序(4个视频)
[ ] 冒泡排序(视频)
[ ] 冒泡排序分析(视频)
[ ] 插入排序 & 归并排序(视频)
[ ] 插入排序(视频)
[ ] 归并排序(视频)
[ ] 快排(视频)
[ ] 选择排序(视频)
[ ] 归并排序代码:
[ ] 快速排序代码:
[ ] 实现:
[ ] 有兴趣的话,还有一些补充,但并不是必须的:
总结一下,这是15种排序算法的可视化表示。如果你需要有关此主题的更多详细信息,请参阅“一些主题的额外内容”中的“排序”部分。
图论能解决计算机科学里的很多问题,所以这一节会比较长,像树和排序的部分一样。
笔记:
MIT(视频):
[ ] Skiena 教授的课程 - 很不错的介绍:
[ ] 图 (复习和其他):
完整的 Coursera 课程:
我会实现:
可以从 Skiena 的书(参考下面的书推荐小节)和面试书籍中学习更多关于图的实践。
如果你需要有关此主题的更多详细信息,请参阅“一些主题的额外内容”中的“字符串匹配”部分。
如果你已经拥有了4年以上的编程经验,那你可以来看看有关系统设计的问题
这一部分有一些短视频,你可以快速的观看和复习大多数重要概念。 这对经常性的巩固很有帮助。
现在你已经了解了上面所有的计算机科学主题,是时候练习回答编程问题了。
编程问题的实践并不是要记住编程问题的答案。
为什么需要练习编程问题:
这里有个很棒的入门教学,内容是如何在面试中有条不紊,并且有互动沟通地解决问题。这种能力可以从面试书籍中获得,但我觉得这个也很棒:算法设计画布。
家里没有白板?那讲得通。我是一个怪人,有一个很大的白板。从白板商店买了一个大的绘图板,而不是白板。你可以坐在沙发上练习。这是我的“沙发白板”。我在照片中添加了笔以便进行缩放。如果你使用笔,则希望可以擦除。快速变得凌乱。我用铅笔和橡皮擦。
补充:
阅读并练习编程问题(按此顺序):
请参阅上方的书单。
一旦你学会了理论基础,就应该把它们拿出来练练。 尽量坚持每天做编码练习,越多越好。
编码面试问题视频:
编码练习平台:
语言学习网站,附带编码挑战:
编码挑战项目:
模拟面试:
随着下面列举的问题思考下你可能会遇到的 20 个面试问题,每个问题准备 2-3 种回答。准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事。
我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景):
恭喜你!
继续学习。
活到老,学到老。
***************************************************************************************************** ***************************************************************************************************** 下面的内容都是可选的。 通过学习这些内容,你将会得到更多的有关 CS 的概念,并将为所有的软件工程工作做更好的准备。你将会成为一个更全面的软件工程师。 ***************************************************************************************************** *****************************************************************************************************
你可以从以下的书单挑选你有兴趣的主题来研读。
UNIX环境高级编程
Linux 命令行大全
TCP-IP详解系列
Head First 设计模式
设计模式:可复用面向对象软件的基础
Linux 和 UNIX 系统管理技术手册(第五版)
算法设计手冊(Skiena)
编程卓越之道(第一卷):深入理解计算机
算法导论
计算机体系结构:量化研究方法(第6版)
编程珠矶
我把它们加进来是为了让你成为更全方位的软件工程师,并且留意一些技术以及算法,让你拥有更大的工具箱。
掌握至少一种平衡查找树(并懂得如何实现):
“在各种平衡查找树当中,AVL 树和2-3树已经成为了过去,而红黑树(red-black trees)看似变得越来越受人青睐。这种令人特别感兴趣的数据结构,亦称伸展树(splay tree)。它可以自我管理,且会使用轮换来移除任何访问过根节点的键。” —— Skiena
因此,在各种各样的平衡查找树当中,我选择了伸展树来实现。虽然,通过我的阅读,我发现在面试中并不会被要求实现一棵平衡查找树。但是,为了胜人一筹,我们还是应该看看如何去实现。在阅读了大量关于红黑树的代码后,我才发现伸展树的实现确实会使得各方面更为高效。
我希望能阅读到更多关于 B 树的资料,因为它也被广泛地应用到大型的数据集当中。
自平衡二叉查找树
AVL 树
伸展树
红黑树
2-3查找树
2-3-4树 (亦称2-4树)
N 叉树(K 叉树、M 叉树)
B 树
--
我为前面提到的某些主题增加了一些额外的内容,之所以没有直接添加到前面,是因为这样很容易导致某个主题内容过多。毕竟你想在本世纪找到一份工作,对吧?
SOLID
Union-Find
动态规划的更多内容 (视频)
图形处理进阶 (视频)
MIT 概率论 (过于数学,进度缓慢,但这对于数学的东西却是必要之恶) (视频):
Simonson: 近似算法 (视频)
字符串匹配
排序
斯坦福大学关于排序算法的视频:
Shai Simonson 视频,Aduni.org:
Steven Skiena 关于排序的视频:
坐下来享受一下吧。"netflix 和技能" :P
个人的动态规划问题列表 (都是短视频)
x86 架构,汇编,应用程序 (11 个视频)
MIT 18.06 线性代数,2005 年春季 (35 个视频)
绝妙的 MIT 微积分:单变量微积分
计算机科学 70, 001 - 2015 年春季 - 离散数学和概率理论
离散数学 (19 个视频)
离散数学(第一部分),Sarada Herke (5个视频)
CSE373 - 算法分析 (25 个视频)
UC Berkeley 61B (2014 年春季): 数据结构 (25 个视频)
UC Berkeley 61B (2006 年秋季): 数据结构 (39 个视频)
UC Berkeley 61C:计算机结构 (26 个视频)
OOSE:使用 UML 和 Java 进行软件开发 (21 个视频)
UC Berkeley CS 152: 计算机结构和工程 (20 个视频)
MIT 6.004: 计算结构 (49 视频)
卡內基梅隆大学 - 计算机架构讲座 (39 个视频)
MIT 6.006:算法介绍 (47 个视频)
MIT 6.033:计算机系统工程 (22 个视频)
MIT 6.034:人工智能,2010 年秋季 (30 个视频)
MIT 6.042J:计算机科学数学, 2010 年秋季 (25 个视频)
MIT 6.046:算法设计与分析 (34 个视频)
MIT 6.050J:信息和熵, 2008 年春季 (19 个视频)
MIT 6.851:高等数据结构 (22 个视频)
MIT 6.854: 高等算法, 2016 年春季 (24 个视频)
Harvard COMPSCI 224:高级算法(25个视频)
MIT 6.858:计算机系统安全, 2014 年秋季
斯坦福: 编程范例 (27 个视频)
密码学导论,Christof Paar
大数据 - 斯坦福大学 (94 个视频)
图论,Sarada Herke(67个视频)
CC-BY-SA-4.0
GitHub repo: qiwihui/blog Follow me: @qiwihui Site: QIWIHUI
GitHub repo: qiwihui/blog
Follow me: @qiwihui
Site: QIWIHUI
原先我为了成为一个软件工程师而建立这份简单的学习主题清单, 但这份清单随着时间而膨胀成今天这样。在做完这份清单上的每个目标后,我成为了 Amazon 的软件开发工程师! 你或许不需要像我一样学习这么多。但是,让你成为一位称职工程师所需要的知识都在这里了。
我每天自学8~12小时,这样持续了好几个月。这是我的故事:为什么我为了 Google 面试而自学了8个月。
在这份清单内的主题会让你拥有足够的知识去面对几乎每家软件公司的技术面试,包括科技巨头:Amazon、Facebook、Google,以及 Microsoft。
祝你好运!
这是?
这是我为了从 web 开发者(自学、非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月。
这份清单适用于 新手软件工程师,或者想从软件/网站开发转向软件工程(需要计算机科学知识)的人员。如果你有多年的经验,并且声称拥有多年的软件工程经验,并且期待一次更艰难的面试。
如果你具有多年的软件/网页开发经验,请注意,大型软件公司(例如 Google,Amazon,Facebook 和 Microsoft)将软件工程视为不同于软件/网页开发,并且它们需要计算机科学知识。
如果你想成为可靠性工程师或运维工程师,请从可选列表(网络,安全)中学习更多。
目录
---------------- 下面的内容是可选的 ----------------
为何要用到它?
当我开始这个项目时,我不知道堆和栈的区别,不了解时间复杂度(Big-O)、树,或如何去遍历一个图。如果非要我去编写一个排序算法的话,我只能说我所写的肯定是很糟糕。一直以来,我所用的任何数据结构都是内建于编程语言当中。至于它们在背后是如何运作,对此我一概不清楚。此外,以前的我并不需要对内存进行管理,最多就只是在一个正在执行的进程抛出了“内存不足”的错误后,才会去找解决方法。在我的编程生涯中,虽然我有用过多维数组,也用过关联数组成千上万次,但我从来没有自己实现过数据结构。
这是一个漫长的计划,以至于花费了我数月的时间。若你早已熟悉大部分的知识,那么也许能节省大量的时间。
如何使用它
下面所有的东西都只是一个概述。因此,你需要由上而下逐一地去处理它。
在学习过程中,我使用 GitHub 特殊语法的 markdown 去检查计划的进展,包括使用包含任务进度的任务列表。
创建一个新的分支,以便你可以像这样去勾选计划的进展:直接往方括号中填写一个字符 x 即可:[x]。
通过单击 Fork 按钮来 fork GitHub 仓库:jwasham/coding-interview-university
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
git add .
git commit -m "Marked x"
git rebase jwasham/master
git push --set-upstream origin progress
git push --force
更多关于 Github-flavored markdown 的详情
不要觉得自己不够聪明
相关视频资源
部分视频只能通过在 Coursera 或者 Edx 课程上注册登录才能观看。这些视频被称为网络公开课程(MOOC)。有时候某些课程需要等待好几个月才能获取,这期间你无法观看这些课程的影片。
面试过程 & 通用的面试准备
为你的面试选择一种语言
你可以在编程这一环节,使用一种自己用起来较为舒适的语言去完成编程,但对于大公司,你只有三种固定的选择:
你也可以使用下面两种编程语言,但可能会有某些限制,你需要实现查明:
我之前写过一篇关于在面试时选择编程语言的文章:为编程面试选择一种语言。
你需要对你所选择的语言感到非常舒适且足够了解。
更多关于语言选择的阅读:
在此查看相关语言的资源
由于我正在学习C、C++ 和 Python,因此在下面你会看到部分关于它们的学习资料。相关书籍请看文章的底部。
书单
为了节省你的时间,以下是比我使用过的更缩减的书单。
面试准备
如果你有额外的时间:
选择以下之一:
编程语言精选
你需要选择面试语言(请参见上文)。
这是我按语言给出的建议。我没有所有语言的资源,欢迎贡献。
如果你通读其中之一,你应该具备了开始解决编程问题所需的所有数据结构和算法知识。除非你需要复习,否则你可以跳过此项目中的所有视频讲座。
额外编程语言的精选资源
C++
我没有读过这两本书,但是它们颇受好评,作者是 Sedgewick,他非常厉害。
如果你有更好的 C++ 书籍,请告诉我。我正在搜集全面的资源。
Java
或者:
Python
在你开始之前
该列表已经持续更新了很长的一段时间,所以,我们的确很容易会对其失去控制。
这里列出了一些我所犯过的错误,希望你不要重滔覆辙。
1. 你不可能把所有的东西都记住
就算我观看了数小时的视频,并记录了大量的笔记,几个月后的我,仍然会忘却其中大部分的东西。所以,我花了3天翻阅我的笔记,并制作成抽认卡(flashcard)帮助我复习:
请阅读以下的文章以免重蹈覆辙:
记住计算机科学知识。
有人推荐给我的课程(但我还沒看过):学习如何学习。
2. 使用抽认卡
为了解决善忘的问题,我制作了一个抽认卡的网页,用于添加两种抽认卡:一般的及带有代码的。每种卡都会有不同的格式设计。
而且,我还以移动设备为先去设计这些网页,以使得在任何地方,我都能通过我的手机及平板去回顾知识。
你也可以免费制作属于你自己的抽认卡网站:
有一点需要记住的是,我做事有点过头,以至于卡片都覆盖到所有的东西上,从汇编语言和 Python 的细枝末节,到机器学习和统计都被覆盖到卡片上。而这种做法,对于要求来说是多余的。
在抽认卡上做笔记: 若你第一次发现你知道问题的答案时,先不要急着把其标注成“已知”。反复复习这张抽认卡,直到每次都能答对后才是真正学会了这个问题。反复地问答可帮助你深刻记住该知识点。
这里有个替代我抽认卡的网站 Anki,很多人向我推荐过它。这个网站用同一个字卡重复出现的方式让你牢牢地记住知识。这个网站非常容易使用,支持多平台,并且有云端同步功能。在 iOS 平台上收费25美金,其他平台免费。
这是我用 Anki 这个网站里的格式所储存的抽认卡资料库: ankiweb.net/shared/info/25173560 (感谢 @xiewenya)
3. 复习,复习,再复习
我留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的抽认卡,以便在空余的时候可以学习。
编程累了就休息半个小时,并去复习你的抽认卡。
4. 专注
在学习的过程中,往往会有许多令人分心的事占据着我们宝贵的时间。因此,专注和集中注意力是非常困难的。放点纯音乐能帮上一些忙。
没有包含的内容
有一些熟悉且普遍的技术在此未被谈及到:
日常计划
部分问题可能会花费一天的时间去学习,而有些则会花费多天。当然,有些学习并不需要我们懂得如何实现。
因此,每一天我都会在下面所列出的列表中选择一项,并观看相关的视频。然后,使用以下的一种语言去实现:
你不需要学会所有的编程语言,你只需要专注在一种编程语言上。
为何要在这些语言上分别实现一次?
就算我没有时间去每一项都这么做,但我也会尽我所能。
在这里你可以查看到我的代码:
你不需要记住每一个算法的内部原理。
在一个白板上写代码,而不要直接在计算机上编写。在测试完部分简单的输入后,到计算机上再测试一遍。
必备知识
[ ] 学习C语言
[ ] 计算机是如何处理一段程序:
算法复杂度 / Big-O / 渐进分析法
数据结构
数组(Arrays)
链表(Linked Lists)
堆栈(Stack)
队列(Queue)
哈希表(Hash table)
[ ] 视频:
[ ] 在线课程:
[ ] 使用线性探测的数组去实现
更多的知识
二分查找(Binary search)
按位运算(Bitwise operations)
树(Trees)
树 —— 笔记 & 背景
二叉查找树(Binary search trees):BSTs
堆(Heap) / 优先级队列(Priority Queue) / 二叉堆(Binary Heap)
排序(Sorting)
[ ] 笔记:
关于堆排序,请查看前文堆的数据结构部分。堆排序很强大,不过是非稳定排序。
[ ] Sedgewick ── 归并排序(5个视频)
[ ] Sedgewick ── 快速排序(4个视频)
[ ] 冒泡排序(视频)
[ ] 冒泡排序分析(视频)
[ ] 插入排序 & 归并排序(视频)
[ ] 插入排序(视频)
[ ] 归并排序(视频)
[ ] 快排(视频)
[ ] 选择排序(视频)
[ ] 归并排序代码:
[ ] 快速排序代码:
[ ] 实现:
[ ] 有兴趣的话,还有一些补充,但并不是必须的:
总结一下,这是15种排序算法的可视化表示。如果你需要有关此主题的更多详细信息,请参阅“一些主题的额外内容”中的“排序”部分。
图(Graphs)
图论能解决计算机科学里的很多问题,所以这一节会比较长,像树和排序的部分一样。
笔记:
MIT(视频):
[ ] Skiena 教授的课程 - 很不错的介绍:
[ ] 图 (复习和其他):
CS 61B 2014 (从 58:09 开始)(视频)完整的 Coursera 课程:
我会实现:
可以从 Skiena 的书(参考下面的书推荐小节)和面试书籍中学习更多关于图的实践。
更多知识
递归(Recursion)
动态规划(Dynamic Programming)
面向对象编程
设计模式
组合(Combinatorics) (n 中选 k 个) & 概率(Probability)
NP, NP-完全和近似算法
缓存(Cache)
进程(Processe)和线程(Thread)
测试
调度
字符串搜索和操作
如果你需要有关此主题的更多详细信息,请参阅“一些主题的额外内容”中的“字符串匹配”部分。
字典树(Tries)
浮点数
Unicode
字节序(Endianness)
网络(视频)
系统设计、可伸缩性、数据处理
如果你已经拥有了4年以上的编程经验,那你可以来看看有关系统设计的问题
终面
编程问题练习
现在你已经了解了上面所有的计算机科学主题,是时候练习回答编程问题了。
编程问题的实践并不是要记住编程问题的答案。
为什么需要练习编程问题:
这里有个很棒的入门教学,内容是如何在面试中有条不紊,并且有互动沟通地解决问题。这种能力可以从面试书籍中获得,但我觉得这个也很棒:算法设计画布。
家里没有白板?那讲得通。我是一个怪人,有一个很大的白板。从白板商店买了一个大的绘图板,而不是白板。你可以坐在沙发上练习。这是我的“沙发白板”。我在照片中添加了笔以便进行缩放。如果你使用笔,则希望可以擦除。快速变得凌乱。我用铅笔和橡皮擦。
补充:
阅读并练习编程问题(按此顺序):
请参阅上方的书单。
编程练习和挑战
一旦你学会了理论基础,就应该把它们拿出来练练。 尽量坚持每天做编码练习,越多越好。
编码面试问题视频:
编码练习平台:
语言学习网站,附带编码挑战:
编码挑战项目:
模拟面试:
当你临近面试时
你的简历
当面试来临的时候
随着下面列举的问题思考下你可能会遇到的 20 个面试问题,每个问题准备 2-3 种回答。准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事。
问面试官的问题
当你获得了梦想的职位
恭喜你!
继续学习。
活到老,学到老。
额外书籍
UNIX环境高级编程
Linux 命令行大全
TCP-IP详解系列
Head First 设计模式
设计模式:可复用面向对象软件的基础
Linux 和 UNIX 系统管理技术手册(第五版)
算法设计手冊(Skiena)
编程卓越之道(第一卷):深入理解计算机
算法导论
计算机体系结构:量化研究方法(第6版)
编程珠矶
附加学习
编译器
Emacs and vi(m)
Unix 命令行工具
信息论 (视频)
奇偶校验位 & 汉明码 (视频)
系统熵值(Entropy)
密码学
压缩
计算机安全
垃圾回收
并行编程
消息传递,序列化和队列系统
A*搜索算法
快速傅里叶变换
布隆过滤器
HyperLogLog
局部敏感哈希
van Emde Boas 树
增强数据结构
平衡查找树(Balanced search trees)
掌握至少一种平衡查找树(并懂得如何实现):
“在各种平衡查找树当中,AVL 树和2-3树已经成为了过去,而红黑树(red-black trees)看似变得越来越受人青睐。这种令人特别感兴趣的数据结构,亦称伸展树(splay tree)。它可以自我管理,且会使用轮换来移除任何访问过根节点的键。” —— Skiena
因此,在各种各样的平衡查找树当中,我选择了伸展树来实现。虽然,通过我的阅读,我发现在面试中并不会被要求实现一棵平衡查找树。但是,为了胜人一筹,我们还是应该看看如何去实现。在阅读了大量关于红黑树的代码后,我才发现伸展树的实现确实会使得各方面更为高效。
我希望能阅读到更多关于 B 树的资料,因为它也被广泛地应用到大型的数据集当中。
自平衡二叉查找树
AVL 树
伸展树
红黑树
2-3查找树
2-3-4树 (亦称2-4树)
N 叉树(K 叉树、M 叉树)
B 树
k-D树
跳表
网络流
不相交集 & 联合查找
快速处理的数学
树堆 (Treap)
线性规划(Linear Programming)(视频)
几何:凸包(Geometry, Convex hull)(视频)
离散数学
机器学习(Machine Learning)
--
一些主题的额外内容
SOLID
Union-Find
动态规划的更多内容 (视频)
图形处理进阶 (视频)
MIT 概率论 (过于数学,进度缓慢,但这对于数学的东西却是必要之恶) (视频):
Simonson: 近似算法 (视频)
字符串匹配
排序
斯坦福大学关于排序算法的视频:
Shai Simonson 视频,Aduni.org:
Steven Skiena 关于排序的视频:
视频系列
坐下来享受一下吧。"netflix 和技能" :P
个人的动态规划问题列表 (都是短视频)
x86 架构,汇编,应用程序 (11 个视频)
MIT 18.06 线性代数,2005 年春季 (35 个视频)
绝妙的 MIT 微积分:单变量微积分
计算机科学 70, 001 - 2015 年春季 - 离散数学和概率理论
离散数学 (19 个视频)
离散数学(第一部分),Sarada Herke (5个视频)
CSE373 - 算法分析 (25 个视频)
UC Berkeley 61B (2014 年春季): 数据结构 (25 个视频)
UC Berkeley 61B (2006 年秋季): 数据结构 (39 个视频)
UC Berkeley 61C:计算机结构 (26 个视频)
OOSE:使用 UML 和 Java 进行软件开发 (21 个视频)
UC Berkeley CS 152: 计算机结构和工程 (20 个视频)MIT 6.004: 计算结构 (49 视频)
卡內基梅隆大学 - 计算机架构讲座 (39 个视频)
MIT 6.006:算法介绍 (47 个视频)
MIT 6.033:计算机系统工程 (22 个视频)
MIT 6.034:人工智能,2010 年秋季 (30 个视频)
MIT 6.042J:计算机科学数学, 2010 年秋季 (25 个视频)
MIT 6.046:算法设计与分析 (34 个视频)
MIT 6.050J:信息和熵, 2008 年春季 (19 个视频)
MIT 6.851:高等数据结构 (22 个视频)
MIT 6.854: 高等算法, 2016 年春季 (24 个视频)
Harvard COMPSCI 224:高级算法(25个视频)
MIT 6.858:计算机系统安全, 2014 年秋季
斯坦福: 编程范例 (27 个视频)
密码学导论,Christof Paar
大数据 - 斯坦福大学 (94 个视频)
图论,Sarada Herke(67个视频)
计算机科学课程
论文
LICENSE
CC-BY-SA-4.0