笔记摘录——Cracking the code interview

纸上写代码
简历:对你参与的任何项目或者工作做一个总结,并阐述最难的部分以及最有趣的部分

不要记忆解决方案:不是说让你不要记忆,而是要想清楚它的思路,也就不需要记忆了
大声地说出来你的想法

微软面试:聪明,对技术有激情,极客
Be nice to your recruiter  对雇佣你的人要好 因为他们决定了要不要雇佣你
4到5轮面试 两个不同的团队;最后一轮是hr(如果前面没有被刷掉的话)
在办公室见面;
一天或者一个星期获得回复;如果一个星期没有回复,发个邮件。
必须准备的问题:
为什么你想在微软工作?
内涵:他想问你是否对技术有激情
好的回答:我的记忆里我一直在用微软的产品,然后我对微软创造了这么多广泛而优秀

的产品而感到
惊奇。比如说我在用vs写游戏代码,它的api真的非常不错。

亚马逊面试:
一个团队会对你电话视频,然后会让你写一些简单的代码以及问一系列的问题来探索你

熟悉那个技术领域。
然后是去西雅图和看中你的技术团队进行4到5轮面试。在白板上写代码,每个人都看不

到其他人的回馈
直到自己提交了回馈。最后会有一个具有否决权的人面试你(从其他团队过来的,他可

能专门地参加过培训,目的是要拔高要求),面试可能会特别困难或者不同的。
一般一个周内会有回复,如果没有就是没戏了。友好地回个邮件问。

亚马逊是一家以互联网为主的公司,所以要关心大规模数据、分布式系统。
另外亚马逊非常关心面向对象的方法。

谷歌公司:
hr比较乱,积极沟通。
首先是电话面试,然后一对6、7个人的面试。
每个面试官都有打分,打分前其他人不知道。一般包含四个方面:分析能力、编码能力

、经验、沟通。
分1-4等级。(不好的表现:傲慢、编码能力差)
分数有差异比较好:都是3.1不如3.6 3.1 3.1 2.6
电话面试不是一个很重要的因素。
谷歌的回复可能比较慢,一个星期没有回复不代表就没戏,友好地回邮件问一下。
互联网公司;关注开发可扩展的系统;系统设计和内存限制;以及比特操作等。
招聘人员的决定可能会被公司高管否决。

苹果公司:
高超的技术
、对申请的职位以及对公司的激情
先是一个电话面,然后是一系列的技术面。如果是校园招聘,会有一个面试流程,然后

你会被你想去的团队的人面或者相关人员。
1对1或者2对1的面试。白板上写代码,并且你所有的想法都清晰地表达出来。午餐也是

一个面试。
每个面试人员关注不同的领域。如果面试完了还有机会,你就会被总监或者vp非正式地

面试。

关注你要面试的那个团队的产品,可能他们会问:
你喜欢它那个方面?你觉得还有什么需要提高改善的?
提供积极的建议表现你对工作的激情。
招聘的一般都是苹果粉丝,表现你对苹果的激情。

雅虎面试:
一般挑选的都是前10-20的学校。技术总监或者经理的电话面试。
6-7个人的45分钟面试。每个面试人负责一个领域,比如某些人关注数据库,某些关注计

算机构造。
5分钟:介绍下自己以及你的项目。
20分钟:编码问题。比如实现归并排序。
20分钟:系统设计。比如:设计一个大型的分布式缓存。
关注系统设计、能设计软件。


The ability to communicate thoughts and ideas, in a clear, concise manner, is 
an absolutely invaluable skill that employers seek

20秒时间在简历上:简历上要展示两个方面:是否聪明;是否能写代码?
1、只包含相关的东西
2、写出你的成就:以如下方式:Accomplished X by implementing Y which led 
to Z 
show what you did, how you did it, and what the results were Ideally, you 

should try 
to make the results “measurable” somehow。
Go out and get project experience;
参加开源项目;

项目:
展示:2 - 4 most significant projects
1、什么语言
2、个人项目还是团队
3、关于什么的内容

不要写懂microsoft office或者一些工具啥的

展示你对语言的精通程度:
“Languages: Java (expert), C++ (proficient), JavaScript (prior experience), 

C (prior experience)”

让懂英语的人校对你的简历。不要出现错误。

简历上不要包含个人信息:比如年龄、婚姻状态、国籍等

一般会问你一些问题:
                                                     你的项目、工作、活动                                
最有挑战的部分:                                 故事(只包含关键字即可)
你学到的东西:
最有趣 的部分
最无趣 的部分
最难的bug:
最享受 的部分
和团队成员的矛盾:


精心准备到什么程度?能熟练地而无碍地说出你的故事。面试前看一下这张表格。(电话面试的话
可以直接把这张表格放在面前)

其他建议:
1当问到你的弱点的时候,说一个真实的弱点:不要说我的弱点是我太努力了等等
好的说法:
Sometimes, I don’t have a very good 
attention to detail While that’s good because it lets me execute quickly, it also means 
that I sometimes make careless mistakes Because of that, I make sure to always have 
someone else double check my work 

2当问到最具挑战的部分的时候:
不要说你要学很多语言和技术。
这是一种逃避的答案,这好像告诉面试者没有什么是真的困难的。

3记住:你不是回答他们问题,而是告诉他们你是怎么样的一个人。多想想问题背后的含义。

4设计一个表格:关于影响的,挑战、失败、成功、影响他人

提前准备好问面试人员的问题,这个也会有意或无意地影响到你的面试结果。

会被提到的问题分类:
1、常规的问题
每天你花多少时间写代码?
每周开几次会议
测试人员、开发人员、项目经理的比例大概是多少?比例有何影响?团队项目如何开展?

2、探索你的技术能力
我注意到你用技术A,那你怎么解决问题B的?
为什么产品采用A协议  而不是B协议。我知道它有很多优点,比如A、b、c等。但是很多
公司不选则它因为某某?

3、对技术的激情
我对可扩展性非常感兴趣,你有这个方面的基础吗或者有机会学习它吗?
我对技术A不是很熟悉,但是看上去它是一个有趣的解决方案。你能多
告诉下我它是怎么工作的吗?

如何准备技术问题

大多数人试着读问题,找答案。不要这样做。
1、试着自己解决问题。有些问题很难,没关系。解决问题的时候试着考虑时间或者空间复杂度。考虑是否能牺牲某一方面提高
另一方面。
2、纸上写代码
3、把纸上的代码敲到电脑。然后把你犯的错误都记录下来。
4、模拟面试。让朋友向你提问:关于算法或者代码方面的。

你需要知道什么

大部分的面试不会问具体的问题:平衡二叉树或者复杂的算法。也许它们自己也不知道。
你只要知道基本的就可以:以下必须知道!!
数据结构:链表、二叉树、Tries、栈、队列、容器(Vectors/ArrayLists)、哈希表
算法: 广度优先搜索、深度优先搜索、二叉树搜索、归并排序、快速排序、树的插入、寻找等
概念:位操作、单例模式、工厂模式、内存(堆、栈)、递归、 Big-O Time

知道怎么实现和使用它们,以及它们的时间和空间复杂度。

训练实现数据结构和算法,可能你会被要求实现或改进它们。越熟悉越好~

一般公司不会问:什么是指针啊等等问题;
大公司关注数据结构和算法,和一些常见问题。

具体地回答,显得不傲慢又能让人印象深刻
» Candidate #1: “I basically did all the hard work for the team ”
»Candidate #2: “I implemented the file system, which was considered one of the most 
challenging components because …”

如果面试官不太了解的话,就忽略细节。他们要进一步了解则继续阐述。

采用:S A R : Situation, Action, Response 方式回答问题。

应付技术问题

1、问清楚问题是什么!面试官的问题极有可能比较模糊。
比如数据类型是啥?有多少数据?要做何种假设?
用户是谁
2、设计一个算法
要考虑如下问题:
1、时间和空间复杂度
2、如果有很多数据会怎么样
3、你的设计是否会引发其他问题
4、是否还有其他方法
5、如果面试官给你具体的数据,你是否用到了它,有可能呢
你忽略了它。
3、写伪代码的时候要告诉面试官你在写伪代码:
很多人写伪代码是为了避免写真的代码。
4、写代码地时候,慢慢来不着急:
用数据结构:用好的数据结构定义。比如找到最小年龄
从一群人当中。你要定义个数据结构代表人。
这给面试官一个印象你考虑了面向对象设计。
白板上的代码紧凑点,可以写多点。

测试
记住要测试你的代码!
1、边界值:比如-,负数,null,最大值等
2、用户输入错误等
3、一般数据测试
算法很复杂或者设计到大量计算的时候,你要边写代码
边测试,而不是到最后才测试。

当你发现错误的时候,你要想,为什么这个错误会发生?!!!
最糟糕的事是:当面试者发现有错误以后,随便改代码
去修正错误。而不是停下来思考原因(一定要深入思考为什么),为什么会这样。

问题解决地越多,就越知道用那个方法去解决问题!!!

解决问题的办法:

1、写出具体的例子,找出规律
2、找到了类似这个问题的其他问题,从而找到答案
3、替换为常量,简化问题
4、只解决特殊情况,比如只有一个元素,然后两个元素,递推
5、遍历数据结构

1、拿到offer后要谈判(比如你已经有其他的offer了等),考虑各种钱的
因素
2、你能学到多少东西?关于职业规划:一定要做一个职业规划,你要怎么样才能到达它,然后不时地自我检查是否在不断地实现它。
*5、10、15年之后你想做什么?你需要提高那种技能?哪个公司或者哪个职位能
帮到你?
*你是想成为管理层还是成为高级开发人员
*钱。如果你只在事业的早期,钱也许不是最重要的。
*开心吗?你喜欢那的人吗?产品呢?你的职位呢?
*公司的名气

在一家公司一直担任一个工程师当然可以。但是如果你要开一家公司或者进入管理层。你必须要检查自己的职业计划。你工作一年对你的职业规划有帮助吗?
是否要离开了?只有你自己能决定。。

#如果你要攀登高山就要远离街道训练。
so,远离编译器。编译器只是用来验证你是否正确的工具。
#排练你项目的相关故事
#抓一个人面试你。在大脑中模拟面试。
#不要一有问题直接就找答案,试着自己解决问题。记住答案不是一个
好方法,学习如何解决问题。
#面试官问你问题,你要如何表达:Situation / Action / Response用这个模式,讲完就ok了
如果面试者想要问更多细节,他们会问的。
#多说说你的想法。如果你不说,面试官不知道你的脑海中在想些什么。
谈你遇到的问题,怎么解决的。中间遇到了什么问题。
#写代码的时候不要着急。仔细想整个过程,尽量周全点,少犯错误。
#脑海中模拟电脑运行和测试代码。
#分解代码(注重面向对象),注意代码的可维护性,设计良好的
数据结构联系数据。
#不要泄气。努力想解决方案。你回答地越好后面的问题可能越难。


@不可能每个问题都正确,因为面试官的工作就是难倒你。
@如果你已经知道面试官问你的问题,你应该告诉面试官:
说明你诚实非常重要;你轻易地回答了问题,
面试官也看的出来,而你不可能假装地和其他人一样。

穿着:
没有洞的牛仔裤(比较正式的场合,比如银行还是要避免牛仔裤)
长裤 搭配漂亮的衬衫或者毛衣

面试的时候最好用c,c++或者java。因为面试官比较熟悉。

面试失败了公司应该会告诉你的。如果不确定发个邮件咨询下。

被公司拒绝后可以重新申请吗?
可以。一般是6个月到1年以后才行。

有经验的人也要面临编码和算法问题。

可从careercup.com上下载所有问题的答案。用Java编写的。








































  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值