cracking the code interview读书笔记

2016-03-19

面试过程

面试主要考察的四个方面: 工作经验,文化匹配,编码技巧,分析能力。最重要的是后面两条。

大公司对工作经验的强调更少一些。小公司对文化匹配更关注一些。

注意以下方面:

  • 不要表现出自大,喜欢争辩,或者很没主见。
  • 花点时间准备简历相关的问题
  • 主要精力集中在编程和算法问题

容易犯的错误:

  1. 在电脑上练习
  2. 忽视行为测试
  3. 不做一些模拟的面试
  4. 记答案
  5. 面试过程中不把思考过程说出来,冷场
  6. 太急燥
  7. 面试写代码太随意
  8. 不测试
  9. 改错误时不够细心
  10. 放弃

特殊场景

社招面试,对数据结构等基础知识考查,跟校招是一样的。不同的地方系统设计和架构问题等方面。

技术经理,还是需要很强的编程能力。除此之外,还有以下领域的技能:

  • 团队合作/领导力
  • 优先级
  • 沟通
  • GTD

面试背后的准备

尽管面试过程决定是否录用,简历是决定着面试机会的。

社交网络。

简历内容,长度。

工作经验要用强调号,角色,成就,按以下格式写:"Accomplished X by implementing Y which led to Z"。做了什么事,怎么做的,结果是什么。对结果描述尽量是可衡量的。

项目选择2-4个最重要的。描述什么样的项目,用到什么语言和技术。不太放多。

编程语言和软件,不要傻B到写会用office。Linux或者Visual Studio可以写,但其实影响不大。语言可以写上专家/精通/有使用经验。

不要有错别字!

行为问题准备

一般会是这种形式:"你最xxx的是xxx",比如遇到的最大的挑战是什么?学到什么?做的最有趣的事是什么?碰到的最难的Bug是什么?过得最快乐的时光是?跟团队最大的冲突是?

有些可以根据简历中写的东西来回答,准备一个好故事。如果是电话面试,推荐可以放这张纸,弄一个这样的表格。这样有一些关键字就可以提示自己如何回答。

其它的问题包括,失败,或者需要说服他人。一般面试leader或者管理岗位更容易碰到。可以做另一张表格。

最大的缺点?给一个真实的缺点,而不是说“我最大的缺点是工作太努力”,这会被认为过于自大,不承认失败。

要问面试官的问题。

“你工作多久了?每周开几次会?团队接下来计划的项目是?“ ----问这些问题可以了解公司日常生活是什么样的。

"我注意到你们使用了X技术,你们是如何处理Y问题的?""为什么选择X协议而不是Y协议?我知道它有A.B.C这些好处,但是也有D问题?" ---问这类问题可以突出技术方面。

“我对scalability特别感兴趣。你有这方面背景么?或者有什么样的机会可以学习?“我对X技术不太熟,但是听起来它很有趣。你可以跟我讲下它是如何工作的么?” ---突出对工作的热情

回答问题时的建议:

  • 要突出自己,又不能给对方自大的感觉。
  • 描述不要太细节,说关键点
  • 回答要有条理。S.T.A.R

技术问题

如何准备技术题目?

  1. 独立解决。考虑时空间效率。问自己是否可以时间换空间或者反之。
  2. 在纸上写算法。
  3. 在纸上测试自己的代码。
  4. 纸上代码原样输入到电脑。

数据结构方面:链表,二叉树,Trie,栈,队列,数组,哈希表

算法:深度优先,广度优先,二分搜索,归并排序,快排,树的插入查找

概念:位操作,单例模式,工场模式,内存(堆、栈),递归,大O表示

设计算法时一定不要忘记了,时空间复杂度?如果数据量非常大会怎么样?有什么限制,是否做了正确的取舍?哪些取舍在哪些场合更重要?推荐的做法是,最先给一下暴力的答案。然后再去优化。

解题方法:举例;模式匹配;简化和泛化;构建基本情况;数据结构头脑风暴

随机生成的数字,存储在可扩展的数组里。如何跟踪中位数。用两个堆,较大的数放在小顶堆,较小的数放在大顶堆。

好的代码:正确、高效、简单、可读、可维护

offer相关

截止时间通常是1到4个星期,这里都可以要求延长。拒绝offer时,给一个不带冒犯性的,又合乎逻辑的理由。被拒绝时,对招聘者付出的时间表示感谢,解释你很失望但对他们的工作表示理解,询问什么时间可以重新申请这家公司。

考虑职业规划:这家公司的名字写在我简历上会怎么样?我能学到多少东西,是否能学到相关的东西?升职计划是怎样的?开发者的职业提升是怎么样的?公司和团队是否成长?如果要离开时,是否会有其它合适的公司,我该去哪?

公司的稳定性不重要。重要的是如果你被裁掉了,是否可以相对容易地再找份新工作。

工作是否会开心:产品。领导和团队。公司文化。工作时间是多长。

谈判:Just Do It,没什么损失。你有其它的候选,他们可能失去你。说具体的数据,想要加多少,而不是想要更多。来回,可能公司不会给你想要的那么多,但可能是当前的和想要的一个中间值。电话沟通>邮件沟通>找个中间人。

规划,如果你干了五年,而简历在后三年没什么可写的,那为什么不在二年时离开。思考十年后该是什么样,为了达到那样,每一步该做什么。每一年,都要思考下一年的经验对自己事业的提升。

关系网,与团队和领导保持联系。员工离开时,与他们保护联系。你的朋友,你的朋友的朋友。帮助他们,这样在需要的时候他们可能帮到你。

对自己诚实,想清楚自己到底想要什么。

面试问题

Q:NxN的矩阵,旋转90度。O(1)空间复杂度。 A:上下交换,对角线交换

MxN的矩阵,如果里面其中一个元素为0,将它所在的一行和一列全置为0。

检查字符串s1是否由s2旋转得到,只能使用一次isSubstring(例如waterbottle是erbottlewat的旋转)

删除无序链表中的重复元素。不使用临时缓存。

找出有环的链表中环的首个节点。

如何用一个数组实现三个栈。

带min操作的栈,min返回栈中的最小值,push/pop/min是O(1)复杂度。

对栈数据结构进行升序排序,可以使用辅助栈。

给定一个有向图,如何判断两个结点是否连通?

给定一个二叉树,将每一层的结点链起来(D层返回D个链表)。

二叉树中两个结点的最小公共祖先。

给定一个二叉树,给一个值。打印出所有二叉树结点求和等于这个值的路径。

给定一个正整数,打印出和它二进制表示中有相同位数1的最大数和最小数。

最到智力题,不要慌张。还是跟普通题目一样,跟面试官讲你是怎么思考这个问题的。记住这些题目的规则和模式。

烧绳子,烧完要1个小时。两根不均匀的绳子。如何用烧绳子来准确的记录15分钟。

9个球,有一个跟其它不一样重。有个天平,可以称出左右哪边重。只称两次,找出重的球。


后记:以前的笔记翻出来,本来没有记一篇博客的价值。但想一想给新人小朋友看到还是挺好,把书读薄并吸收消化。

也基本上只能给小朋友看看了。想想一些经历,感慨万千,其实大家都不容易,无论是招人的还是找工作的。记得刘末鹏老师写过一篇《怎样花两年时间去面试一个人》。也许什么时候有心情了,专门说一说面试的话题。

  1. 最好的人也许不投简历,就决定去哪里了。所以要在他们做决定前找到他们。
  2. 比较差的会投很多次简历,找不到工作的时间越多,投的简历越多,给整个pool 带来很多噪音,top10%的简历也许根本不算全部人的top10%。
面试题读书笔记