cracking the code interview读书笔记
2016-03-19
面试过程
面试主要考察的四个方面: 工作经验,文化匹配,编码技巧,分析能力。最重要的是后面两条。
大公司对工作经验的强调更少一些。小公司对文化匹配更关注一些。
注意以下方面:
- 不要表现出自大,喜欢争辩,或者很没主见。
- 花点时间准备简历相关的问题
- 主要精力集中在编程和算法问题
容易犯的错误:
- 在电脑上练习
- 忽视行为测试
- 不做一些模拟的面试
- 记答案
- 面试过程中不把思考过程说出来,冷场
- 太急燥
- 面试写代码太随意
- 不测试
- 改错误时不够细心
- 放弃
特殊场景
社招面试,对数据结构等基础知识考查,跟校招是一样的。不同的地方系统设计和架构问题等方面。
技术经理,还是需要很强的编程能力。除此之外,还有以下领域的技能:
- 团队合作/领导力
- 优先级
- 沟通
- 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
技术问题
如何准备技术题目?
- 独立解决。考虑时空间效率。问自己是否可以时间换空间或者反之。
- 在纸上写算法。
- 在纸上测试自己的代码。
- 纸上代码原样输入到电脑。
数据结构方面:链表,二叉树,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个球,有一个跟其它不一样重。有个天平,可以称出左右哪边重。只称两次,找出重的球。
后记:以前的笔记翻出来,本来没有记一篇博客的价值。但想一想给新人小朋友看到还是挺好,把书读薄并吸收消化。
也基本上只能给小朋友看看了。想想一些经历,感慨万千,其实大家都不容易,无论是招人的还是找工作的。记得刘末鹏老师写过一篇《怎样花两年时间去面试一个人》。也许什么时候有心情了,专门说一说面试的话题。
- 最好的人也许不投简历,就决定去哪里了。所以要在他们做决定前找到他们。
- 比较差的会投很多次简历,找不到工作的时间越多,投的简历越多,给整个pool 带来很多噪音,top10%的简历也许根本不算全部人的top10%。