您的位置:首页 > 其它

笔记摘录——Cracking the code interview

2014-11-12 23:42 176 查看
纸上写代码

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



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

大声地说出来你的想法

微软面试:聪明,对技术有激情,极客

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编写的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: