随着各大公司春招的开始,不少小伙伴都行动起来了,我有幸可以加入百度并和你们分享本身的经验心得。因为我面试的都是比较大的公司,因此天然也是作了这方面的准备,所以这篇总结并不必定适合想去创业公司的同窗。另外,因为经验原本就是主观性极强的东西,加之笔者水平有限,因此若是有不承认的地方,万望诸君呵呵一笑,抛之脑后。php
接下来,我就斗胆分享一下本身在准备和参加面试的过程当中的收获、对面试的思考,以及一些可能对你们有用的建议。最后附赠一份大礼包,但愿能帮助每位读者找到本身心仪的工做。html
有些人可能会把面试看的过重,以为面试过了就能进入大厂,技术和财富兼得……node
我却是以为,面试没有这么夸张(抱歉作了一回标题党),它实际上是一次你和面试官互相了解的绝佳机会,借此机会你还能够对将来的工做有初步的了解。ios
面试自己并不能彻底评价一人个的实力。面试经过的人,也许只是刚好在面试时遇到了本身熟悉的问题,面试不经过,也有多是面试官自身的问题,并不是每一个面试官都具有客观评价别人的能力。git
换句话说,面试没经过也许是面试官没有发现你的才华,面试经过了也并不表明你就能胜任工做,由于进入企业以后可不是天天负责回答面试题!程序员
因此从这一点来看,面试有点像相亲。你满意我,我满意你,王八对绿豆——看上眼了,那就一拍即合,不然就分道扬镳。我本人很是但愿可以多几轮面试(实际并不老是能作到),这样你们都有充足的时间互相了解,决定去留。github
网上某些面经中,介绍了一些“装逼”的方法,还有所谓的“面试技巧”,我是不太承认的。技巧须要有,这是为了让你更好的展现本身,而非坑蒙拐骗,无理取闹,无中生有。我更想展示一个真实的本身,若是面试官不承认,说明咱们没有缘分,或者说本身的能力还不够。面试
有一位小伙伴面试阿里被拒后,面试官给出了这样的评价:“……计算机基础,以及编程基础能力上都有所欠缺……”。但这种笼统的回答并不是是咱们但愿的答案,所谓的基础到底指的是什么?正则表达式
做为一名 iOS 开发者,我所理解的基础是 操做系统、网络和算法这三大块,不一样的开发方向可能有不一样的侧重,但基础总的来讲就是这些。我不推荐经过去网上看教程来学习这些基础知识,由于能用短短几篇文章讲明白的事情不叫基础,至少我没见过写得这么深刻浅出的文章。算法
不知道有多少读者和我同样有过这样的困扰:“我知道某些东西很重要,因此去百度查了资料,可是查到的文章质量不好,正确率没有保证”。这实际上是正常的,优秀的文章通常都放在优秀的做者的我的博客上,这偏偏是搜索引擎的盲区,因此通常只能搜到 CSDN、博客园这种地方的文章。天然就没法保证文章质量。
出于这种考虑,我在文章最后的复习资料中,提供了用于学习相关基础知识的书籍,若是您刚好是 iOS 开发者,还能够阅读我收集的一些高质量文章,正确性比较有保证(我写的除外)。
除了准备通用的基础知识之外,简历也是一个很重要的环节。一直很仰慕唐巧老师的猿题库,无奈简历太差,都没有收到面试邀请。后来好好改了简历之后,就没有这种问题了。关于简历的书写,推荐两篇文章:如何写面向互联网公司的求职简历、程序猿简历模板。你也能够参考个人简历,没有亮点,就当是抛砖引玉。
最后,固然是准备好相关岗位的基础知识了。做为 iOS 开发者,虽然 Swift 已经发布了快两年,可是大公司转向 Swift 的动做还不明显,因此 Objective-C 几乎是必备项,Swift 都不必定能算是加分项。iOS 方面的知识也必不可少,虽然招聘信息上写着若是基础扎实,零 iOS 基础也能够,可是现实每每是比较残酷的。
扯了这么多,终于进入正题了,分享一下个人面试经历。题目以下,破折线后面是简单的解决思路。
首先是四个算法题:
partion
函数的原理,堆排(不稳定),归并排序,基数排序。而后有一个智力题,没完整的答出来,好像影响不是很大。
最后是 iOS 相关,面试官问的很开放,都是谈谈本身的理解:
load
方法和 initialize
方法的异同。——主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的?一面的问题很是基础,主要是算法和 Objective-C,由于准备比较充分,基本上答出来 80% 吧。大约一周后忽然二面。
二面比较忽然,显示简单的自我介绍,而后问了三个问题:
虽然经过了,可是几乎又问了一遍一面的问题让我感受对方不太认真。
首先是给一个小时,手写算法两个算法题。接下来问了 TCP 握手相关的。最后问了 OC 的一些细节问题。
主要是计算机方面的大杂烩,涉及操做系统,网络,移动开发,算法等。难度不大,目测是为了淘汰浑水摸鱼的人,就不列出题目了,算法有三题,直接在线写(木有 IDE 表示很忧伤):
[5,5,10,2,3]
一共有四个子数组的和是 15,好比 [5,10]
,[5,10]
,[10,2,3]
,[5,5,2,3]
。这个就是简单的递归了,分两种状况,当前位置的数字在子数组中,以及不在子数组中。所有是 iOS 题,多是以为算法已经面过了:
NSString *s2 = s1; s2 = nil
这样的语句,可能就不会有 retain
和 release
方法了。 bind
函数了解过么,果断说已经忘了😂😂😂原本觉得面的这么差确定是挂了,没想到仍是过了一面。过了不到一个小时,HR 电话打过来,约了两天后二面。
纯数学和算法:
下面这段代码的输出结果是:
int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf(“%d,%d”,*(a+1),*(ptr-1)); }
答案是 2 和 5。a
是指向数组开头元素的指针,a + 1
就是指向下一个元素的指针,因此星号求值之后是 2。&a
至关因而数组的指针,&a + 1
是数组后面一个数组的指针,而后转换成int *
类型是 5 这个数字后面的一个数字的指针。再减一就是指向 5 的指针,因此星号求值之后是 5。
某个地方天气有以下规律:若是第一天和次日都不下雨,则第三天下雨的几率为30%;若是第一天和次日中有任 意一天下雨,则第三天下雨的几率为60%。问若是周一周二都没下雨,那么周四下雨的几率为_。
简单的几率题,答案是:30% * 60% + 70% * 30% = 39%
某痴迷扑克的小团体喜欢用23456789TJQKA来计数,A后面是22,23,...,2A,32,...,AA,222,... 依次类推。
请用C/C++或Java写个程序,将用字符串表示这种计数法转换成字符串表示的10进制整数。其中,该计数法的2就对应于十进制的2,以后依次递增。C/C++函数接口: char pokToDec(char )
个人解决思路是进制转换,相似于 16 进制转换 10 进制这种,最后再把数字转成 char *
类型。
而后好像没结果了,多是编程实现太渣了?
MVC
具备什么样的优点,各个模块之间怎么通讯,好比点击 Button 后 怎么通知 Model?UITableView
的相关优化KVO
、Notification
、delegate
各自的优缺点,效率还有使用场景KVO
copy
方法SEL
和 IMP
的区别autoreleasepool
的使用场景和原理RunLoop
的实现原理和数据结构,何时会用到block
为何会有循环引用GCD
如何实现这个需求:A、B、C 三个任务并发,完成后执行任务 D。NSOperation
和 GCD
的区别CoreData
的使用,如何处理多线程问题cell
是否显示在屏幕上TCP
与 UDP
区别TCP
流量控制UIView
生命周期viewDidDisappear
方法和 B 的 viewDidAppear
方法哪一个先调用?block
循环引用问题ARC
的本质RunLoop
的基本概念,它是怎么休眠的?Autoreleasepool
何时释放,在什么场景下使用?面试官可能会问到你闻所未闻的算法,这时候你不该该本身瞎想,而是先和面试官把问题讨论清楚。要知道,经过沟通弄明白复杂的问题也是一种能力,在和面试官交流的过程当中,不只仅能够搞清楚题目真正的意思是什么,还能够展示本身良好的交流沟通能力。因此千万不要由于紧张或者害羞而浪费此次大好的机会。
有些题目似曾相识,可是暂时没有思路。这时候不妨告诉面试官,给我一些时间思考这个题。而后不要急,不要慌,就当他不存在,拿出纸和笔慢慢算(这充分说明了面试戴耳机的重要性)。你必定要坚决一个信念:“任何一道稍微有难度的算法题,除非作过,不然必定是须要时间想的”。因此,合理的安排思考时间吧。若是十几分钟都想不出来,能够直接放弃。
有时候面试官会要求在线编程,相信我,他不会无聊到盯着你的代码看的,面试官通常都很忙,他也有本身的工做要完成,因此你就当是用本身的 IDE 就好。在线编程每每是一个中等难度的问题,因此不要本身吓唬本身。同时要注意代码格式的规范,适当的注释,提早编写好测试用例等,即便没有解决问题,也至少要把本身良好的编程习惯展现给面试官。
这个问题有多是面试官故意说得含糊不清,考察你的交流能力,也有多是无心的,或者是你的理解方式出现了误差。无论是以上哪一种问题,你都应该先和面试官交流,直到你搞懂了面试官要问你什么,而不是按照本身的理解说了一堆无用的东西。
举个例子,面试官可能会问了一道算法题:“如何判断两个无限长度的链表是否有交点?”。对于“无限长度”能够有不一样的理解,若是真的是有无穷多个节点,那显然这个问题是没法解决的。但若是链表仅仅是有环,那么仍是能够解决的。若是面试官的本意是链表有环,但你错误的理解成了无穷多个节点,那么必然会致使没法回答这个问题。并且这并不是能力不足,而是属于交流沟通方面的失误,这也正是我想分享的“技巧”。
还有一些问题,虽然你没有接触过,可是因为对相似的问题或者状况有过思考,因此能够合理假设。好比面试官问 “ARC 会对代码作什么样的优化?”。咱们知道 ARC 的本质就是在合适的地方插入 retain
和 release
等方法,那么就应该从这个角度出发去思考问题。
显然分别执行 retain
和 release
操做是没有必要的,那么就能够构造出相应的例子:
NSString *s1 = @"hello"; NSString *s2 = s1; NSString *s2 = nil;
因为这种问题咱们没有真正实践过,因此能够委婉的告诉面试官:“根据个人推理,可能会有……”。
遇到不会的问题果断认可啊。若是是基本问题,好比问你哈希表怎么实现,你说不会,那么此次面试可能就悬了。若是是有必定难度的问题,那么你认可不会,也是一种明智之举,毕竟人无完人,一个问题不会并不能全盘否认一我的的能力。
可是比较糟糕的一种状况是,面试者因为过度紧张,担忧答不上面试官的问题会有严重后果,因此尝试着去敷衍面试官。好比:“我猜是 xxx 吧”,“我以为多是 ……”,更有甚者直接装逼:“这个我试过,不就是 xxx 么”。要知道,此时的你,因为紧张,在心态上已经输给了面试官,更况且面试官问你的问题必定是他有把握的,你以为这时候你负隅顽抗会有几成胜算呢?
因此,面试官问我“堆排序”的细节时,因为我当时忘了堆排序是怎么实现的,因此我直接告诉他我记不清了。另外一个主动认输的例子是面试官问我 RAC 如何实现双向绑定,我告诉他这个是我当时学习的时候写过的 demo,由于不经常使用,已经只记得一些简单的概念了。
最后,还须要保持一个平稳的心态:“面试时尽力就好,遇到本身不会的问题也是正常状况”。若是面试者顺利答对了全部问题,不免会让面试官感到一丝尴尬,面试者也有可能会产生一些别的情绪。因此,咱们要作的只是把本身的能力展现给面试官,作到不骄不躁。
除了可以回答上面试官的问题之外,我建议本身准备一两个杀手锏级别的话题。所谓的杀手锏,至少具有如下几个特征:
以 iOS 中的 UITableView
的调优为例,我自认为对它有必定的理解,同为 iOS 开发者的读者能够阅读这篇文章:UIKit性能调优实战讲解,同时我还仔细研究了 sunnyxx 大神的 优化UITableViewCell高度计算的那些事。
这一类的话题一般须要仔细研究官方文档,iOS 开发者还能够观看 WWDC 视频,而后花上充足的时间去总结。好比我写 iOS自定义转场动画实战讲解 这篇文章就花了至少三天时间,包括大年初一一成天。
因为此类话题数量很少,因此准备一个或数个便可,面试时能够有意识的将面试官引导到这些话题上去,从而充分的展现本身。
一般状况下,面试结果都会在 1 - 3 天内知道。有的面试官会当场告诉你经过了,有的公司面试结束后几个小时就能出结果。
但有些时候,因为某些缘由(我也不清楚。。。。多是比较忙?),你迟迟没法获知面试结果。这时候你能够选择耐心等待,获知直接给 HR or 内推者发送邮件。通常来讲面试结束后三天还没收到通知,你能够发送邮件询问或者再等等。
对于读到这一段的读者,为了感谢你耐心的听我废话了这么久,送上一波精心整理的干货和资料。不敢说彻底没有错,可是应该比本身去查要靠谱得多。主要涉及算法、网络、操做系统、Objective-C 和 iOS 五个方面。若是你不是 iOS 开发者,相信前三部分的资料也或多或少可以帮上你。
这一部分的内容主要分为如下几个部分:字符串、数组与查找、链表、树以及其余基础问题。
总的来讲,算法问题能够分为如下三类:
通常来讲,一类问题难度不大,面试前简单复习一下,面试时当心仔细,全面思考便可。二三类问题是面试重点,须要提早准备。第四类问题一般出现较少,即便不会作,对最终评价的负面影响也不会有前三类那么大。
若是时间充裕,我建议阅读《剑指 Offer》这本书并配合 Leetcode 来巩固知识,在个人面试过程当中,出现不少书上的原题或者变体,我自认为没有由于算法而影响任何一次面试的成绩。若是时间紧张,你也能够只完成我列出的一些经典题目,在“【】”中标记了我对此题类型的分类,若是加星号表示此题在实际面试中出现过。
PS: 最近有小伙伴被问到了哈希表的实现。这能够理解为算法,也能够归类为计算机基础知识。总的来讲你至少须要明白哈希值的特色和两种解决冲突的方式:拉链式和开放寻址。
字符串
动态规划
数组
链表
树
栈
排序
了解如下排序的时间、空间复杂度,是否稳定,实现原理
位运算
根据不一样的面试岗位,侧重点略有不一样。对 iOS 和 Android 开发者来讲,HTTP 考的略少,以 TCP 和 UDP 为主。其实 UDP 基本上只会考察和 TCP 的区别。
固然还有一些常见的基础问题,好比 Cookie 和 Session 的考察,POST 和 GET 的考察,HTTPS 的简单了解等。这些问题在个人博客中都有简单的总结。
总结了一些资料,数字序号越大的资料表示篇幅更长,耗时更久,难度更大,讲解更细致。破折线后表示预计须要多久能够读完。
光读书是没有用的,一问到实际问题很容易懵逼,如下是我总结的一些问题:
我被问到的操做系统问题不多,因此仅仅总结了一些自认为比较重要的问题。关于这一部分的知识,推荐阅读《程序员的自我修养》,若是时间有限,你能够阅读个人《程序员的自我修养读书笔记》,并思考这些问题:
关于多线程相关的,推荐阅读这篇文章的前面一小部分——《iOS多线程编程——GCD与NSOperation总结》
关于操做系统和编译方面的文章,除了读原书和个人读书笔记外,还能够参考这篇文章——《修改一个数字破解Mac上的应用》
首先两本必备的神书必定是要读完的。一本是讲 OC 的《Effective Objective-C 2.0》,中文名叫:“编写高质量 iOS 与 OS X 代码的 52 个有效方法”。另外一本书叫:《Objective-C 高级编程》。前者讲解 OC 中各类细节,后者主要讲了 ARC、Block 和 GCD。
光是读书,思考不够,很容易在面试时被问懵逼,因此建议一遍尝试回答面试真题,一边阅读如下总结性的文章,重要性不分前后:
强烈推荐第八篇文章,作完这上面的题目基本上能够应付大多数 OC 方面的问题了。
其中须要重点了解 runloop
,它不只仅是简单的“跑圈”的 概念,不少问题其实都与它有关,建议认真阅读 ibireme 大神的总结