随着各大公司春招的开始,很多小伙伴都行动起来了,我有幸能够加入百度并和大家分享自己的经验心得。由于我面试的都是比较大的公司,所以自然也是做 了这方面的准备,因此这篇总结并不一定适合想去创业公司的同学。另外,由于经验本来就是主观性极强的东西,加之笔者水平有限,所以如果有不认可的地方,万 望诸君呵呵一笑,抛之脑后。
接下来,我就斗胆分享一下自己在准备和参加面试的过程中的收获、对面试的思考,以及一些可能对大家有用的建议。最后附赠一份大礼包,希望能帮助每位读者找到自己心仪的工作。
作为 iOS 开发者,虽然 Swift 已经发布了快两年,但是大公司转向 Swift 的动作还不明显,所以 Objective-C 几乎是必备项,Swift 都不一定能算是加分项。iOS 方面的知识也必不可少,虽然招聘信息上写着如果基础扎实,零 iOS 基础也可以,但是现实往往是比较残酷的。
扯了这么多,终于进入正题了,分享一下我的面试经历。题目如下, 破折线后面是简单的解决思路。
首先是四个算法题:
partion
函数的原理,堆排(不稳定),归并排序,基数排序。然后有一个 智力题 ,没完整的答出来,好像影响不是很大。
最后是 iOS 相关,面试官问的很开放,都是谈谈自己的理解:
load
方法和 initialize
方法的异同。——主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的?一面的问题非常基础,主要是算法和 Objective-C,因为准备比较充分,基本上答出来 80% 吧。大约一周后突然二面。
二面比较突然,显示简单的自我介绍,然后问了三个问题:
虽然通过了,但是几乎又问了一遍一面的问题让我感觉对方不太认真。
首先是给一个小时,手写算法:
没能写完,主要是大数相加的时候需要考虑负数,耽搁了一点时间。
然后让我简述 TCP 建立和关闭连接时,握手的过程。还问了前者为什么是三次,后者需要四次?
接下来是设计了一个实际场景,为了简化问题,我们考虑这个问题:假设有 10W 条电话号码,如何通过输入电话号码的某一段内容,快速搜索出来。比如输入 234
,以下两个号码都会显示在搜索结果中:
其实最简单的解决方案是遍历所有字符串,然后用 KMP 算法。但是这样的问题是需要遍历 10W 个元素,效率比较低。我想到的是办法是使用索引。建立 100 个索引(00 到 99),比如输入 234
时只需要在索引 23
对应的区域查找即可,可以加快 100 倍速度。但是缺点是插入数据时,需要更新多个索引,数据量会是原来的 10 倍。
目前还没有想到好的解决方案。有大神提醒说用字典树,有空研究一番。
最后问了 OC 的数组中,添加 nil
对象会有什么问题。当时没答上来,现在想想很不应该,因为数组是以 nil
结尾的,如果添加了 nil
,后续就不能添加对象了。
主要是计算机方面的大杂烩,涉及操作系统,网络,移动开发,算法等。难度不大,目测是为了淘汰浑水摸鱼的人,就不列出题目了,算法有三题,直接在线写(木有 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
函数了解过么,果断说已经忘了