程序员面试金典(第5版) 读书笔记

程序员面试金典(第5版)



2016-06-23
原文:抛开这个环境吧,让我们拿出纸和笔。你可以在写好全部代码并做过人工测试之后,再在计算机上用编译器进行验证。


2016-06-23
原文:你回答行为问题的表现其实还会左右面试官对你技术能力的看法。行为问题的准备工作其实相对比较轻松,而且容易达到事半功倍的效果


2016-06-23
原文:死记硬背答案最多只能解决一些特定问题,但是一碰到新的题,你可能就傻眼了。而且,基本上你不太可能碰上出自本书的题目。 最靠谱的做法就是,不看答案,先把书里的题全部认真做一遍。这样你才有可能练就各种技能和技巧,从容应对新问题。就算最后你只能大概复习一下为数不多的题,这种做法也会对你很有帮助。质量胜于数量。


2016-06-23
原文:写程序不是什么竞赛,面试也不是,所以解题时不要太过仓促。代码写得太草率容易出问题,也说明你这个人不够细心。请放慢节奏,有条不紊,多做测试,问题考虑得周全些。这么一来,最终你反而能更高效地给出答案,错误也会少一些。


2016-06-23
原文:代码冗余、数据结构乱七八糟(比如,缺少面向对象设计)等等,这些都是常见错误!写代码时,不妨设想一下你是在处理实际问题,要注重可维护性。将代码划分成不同的子程序,并精心设计数据结构来处理相应的数据。


2016-06-23
原文:我知道面试题都很难,但不难怎么显出求职者的水平呢。你会迎难而上还是轻言放弃?态度很重要,面试官都喜


2016-06-23
原文:欢那些不畏挑战、迎难而上解决问题的求职者。毕竟,面试本来就不简单。所以,碰到棘手的问题请不要惊慌,也不要轻言放弃。


2016-06-23
原文:公司最青睐的人才必须具备两大特性:一是天资聪颖,二是扎实的编程功底


2016-06-23
原文:二叉树与二叉查找树 碰到二叉树问题时,许多求职者会假定面试官问的是二叉查找树。此时务必问清楚二叉树是否为二叉查找树。二叉查找树附加有如下条件:对于任意结点,左子结点小于或等于当前结点,后者又小于所有右子结点。 平衡与不平衡 许多树都是平衡的,但并非全都如此。树是否平衡要找


2016-06-23
原文:面试官确认。如果树是不平衡的,你应当从平均情况和最坏情况所需时间来描述自己的算法。注意,树的平衡有多种方法,平衡一棵树只意味着子树的深度差不会超过一定值,并不表示左子树和右子树的深度完全相同。 完满和完整(Full and Complete) 完满和完整树的所有叶结点都在树的底部,所有非叶结点都有两个子结点。注意完满和完整树极其稀少,因为一棵树必须正好有2n 1个结点才能满足这个条件。


2016-06-23
原文:2.二叉树遍历 面试之前,你应该能够熟练实现中序、后序和前序遍历。其中最常见的是中序遍历,先遍历左子树,然后访问当前结点,最后遍历右子树。


2016-06-23
原文:大部分求职者都比较熟悉二叉树的遍历,但图的遍历则要难得多。广度优先搜索(BFS)更是难上加难。 值得注意的是,广度优先搜索(BFS)和深度优先搜索(DFS)通常用于不同的场景。如要访问图中所有结点,或者访问最少的结点直至找到想找的结点,DFS一般最为简单。不过,如果一棵树的规模非常大,在离最初结点太远


2016-06-23
原文:想要随时退出的话,DFS可能会有问题;我们可能搜索了该结点的成千上万个祖先结点,却还未搜索该结点的全部子结点。对于这些情况,一般首选BFS。 深度优先搜索(DFS) 在DFS中,我们会访问结点r,然后循环访问r的每个相邻结点。在访问r的相邻结点n时,我们会在继续访问r的其他相邻结点之前先访问n的所有相邻结点。也就是说,在继续搜索r的其他子结点之前,我们会先穷尽搜索n的子结点。 注意,前序和树遍历的其他形式都是一种DFS。主要区别在于,对图实现该算法时,我们必须先检查该结点是否已访问。如果不这么做,就可能陷入无限循环。


2016-06-23
原文:广度优先搜索(BFS) BFS相对不太直观,除非之前熟悉BFS的实现,否则大部分求职者都会觉得它很难对付。 在BFS中,我们会在搜索r的“孙子结点”之前先访问结点r的所有相邻结点。用队列实现的迭代方案往往最有效。


2016-06-27
原文:拆分大量的数据 尽管有时我们可以增加计算机的硬盘空间,不过,难免会遇到必须将数据拆分至多台计算机的情形。随之而来的问题是,哪些数据要放在哪一台机器上。下面有几种策略可供参考。 按出现的顺序 我们可以按出现的顺序直接划分数据。也就是说,有新数据进来时,先放进当前机器,填满之后,再加一台机器。这么做的好处是不会浪费资源。然而,根据具体问题和数据集的不同,查找表可能会变得非常复杂、异常巨大。 按散列值 另一种做法是根据数据的散列


2016-06-27
原文:值存放数据。具体一点来说,我们会采取以下步骤:(1) 根据数据挑选某种键;(2) 利用散列函数得到键的散列值;(3) 将散列值除以机器数量求得余数;(4) 将数据存储在这个值对应的机器上。也就是说,数据会存放在编号为#[mod(hash(key), N)]的机器上。 这种做法的好处是不用创建数据查找表。每一台计算机自动掌握数据的存储位置。然而,这也会出问题,那就是某台机器的数据可能会多一些,并最终超出它的存储容量。若发生这种情况,可以将数据迁移到其他机器上,以实现更好的负载均衡(但开销很大),或者将这台机器的数据拆分到两台机器上(形成一组树状结构的机器)。


2016-06-27
原文:按实际值 按散列值划分数据本质上是随机的;数据代表的具体意义与存储数据的机器之间,并不存在任何关系。在某些情况下,我们也许可以利用数据所代表的信息来降低系统延迟。 例如,假设你正在设计一个社交网站。虽然人们的朋友会来自世界各地,但实际上,相比俄罗斯普通公民,住在墨西哥的人可能拥有更多来自墨西哥的朋友。或许,我们可以将“类似”数据存储在同一台机器上,这样在查找墨西哥人的朋友时,只需访问较少数量的机器就能取得相关资料。 随机存储 通常情况下,我们只是随机


2016-06-27
原文:分数据,再实现一个查找表以表明哪台机器拥有哪些数据。虽然这肯定需要一张巨大的查找表,但它简化了系统设计的某些方面,使我们得以实现更好的负载均衡。


2016-06-27

原文:上下文切换(context switch)是两个进程之间切换(也即,将等待中的进程转为执行状态,而将正在执行的进程转为等待或终止状态)所耗费的时间。这样的动作会发生在多任务处理系统中,操作系统必须将等待中进程的状态信息载入内存,并保存执行中进程的状态信息。


图:

程序员面试金典(第5版) 读书笔记_第1张图片程序员面试金典(第5版) 读书笔记_第2张图片程序员面试金典(第5版) 读书笔记_第3张图片程序员面试金典(第5版) 读书笔记_第4张图片程序员面试金典(第5版) 读书笔记_第5张图片程序员面试金典(第5版) 读书笔记_第6张图片程序员面试金典(第5版) 读书笔记_第7张图片程序员面试金典(第5版) 读书笔记_第8张图片





你可能感兴趣的:(读书笔记)