记录2015年阿里校招实习生面试内容

我所在地区的阿里2015年校招实习生招聘工作已经结束了,这次校招也是我第二次现场面试,自己也有好多收获和感悟,索性记下来。
首先说这次面试流程,阿里的面试流程效率还是很高的,比较好的一点就是可以自己选择面试时间,这个和其他几个相比还是很人性化的一点,面试地点离我们学校不太远,所以就没有去的太早,结果发现等我赶到的时候刚坐下没几秒钟就叫到我的号去面试了,所以没有出现所谓的面试拖延问题,当时还是有点紧张的。所以建议大家还是提前一段时间赶到面试现场,否则迟到的话印象会大打折扣。

面试内容

我投递的是iOS客户端开发方向,后面可能有跟语言相关的部分,非这个方向可略过。
首先说面试官真的nice,并且很帅啊,直男就不花痴了(>﹏<)。我认为一个好的面试官一是懂得尊重学生,学生水平不一,不能因为学生不会就面露一些不满意的情绪;二是能引导学生去思考,说实话现场面试一般都会紧张,一些之前知道的知识点可能无法串联起来,这时如果面试官能够很好的引导学生去思考,学生就可能回答的令他很满意。这个面试官真的很好的满足了这两点,赞一个。
面试中问道的一些问题,挺多的,也可能记不太清晰了,就按记忆一个个罗列出来吧:

  • 假如给你两个无序链表,比如{1,4,3,2,5}以及{5,3,1,4,2},如果两个链表所含元素个数相同,并且都在一个链表中出现的元素都能在另外一个链表中找到,就表示这两个链表相等,请问有什么好的方法能够判断这两个链表是否相等?
    这一题考察的不太难,我想到了用位图法去解决这个问题,另外一个hash法也能解决这个问题,这题相对来说比较容易。
  • 给一个包含各种类型的struct,说明下占用的内存大小,比如
    struct Foo{
        int * a;
        int b;
        double c;
    }

这题无非是考察结构体内存对齐问题,这个问题也不大,,我这篇文章c/c++字节对齐记录了学习内存对齐的总结,还有大端法小端法的一些问题。

  • 现在的开发从32位系统变到了64位系统,自己有没有做过相关的优化问题?
    这个说实话自己说几乎没做什么优化,回答的很差,其实苹果官网给出了从32bit到64bit的一些变化问题,当时面试官提示我说内存对齐就是一个优化问题,比如上题,指针大小在64bit下已经变了,因此它们之间的相对位置变化就可能导致内存占用的大小不一样,这就是一个优化问题。苹果的优化有如下几点:

    • 避免将64-bit long类型整数赋值给32-bit整型(长度有4bytes变成了8bytes)
    • 避免将64-bit 指针赋值给32-bit指针。
    • 避免因为算术操作造成的指针和long 整型的精度缩短问题。
    • 修正因为数据类型变化导致的对齐问题
    • 确保在32-bit和64-bit运行时共享的内存结构的内存布局相同。
    • 重写一些汇编代码.
    • 避免将可变参数函数转化成一个固定长度参数的函数。

我自己常常将int型直接转化成NSInteger,32-bit下这是没问题的,但是在64-bit下这个就会有精度问题。

  • 一个家族,加入每对父母最多有两个孩子,请问这个家族用什么数据结构表示比较好?
    想到了二叉树就应该差不多了,面试官进一步补充说如果求出家族中除了根节点之外子孙最多的的分支,这个肯定就是在根节点的左右孩子节点之间做出选择,但是如何去遍历求出来呢?我想到了广度优先,这个可能需要引入额外的空间消耗,这时面试官提示我说有没有更好的选择,我当时没想到更好的选择了,然后面试官就提示我说你感觉从叶子节点向上遍历是不是一个更好的选择呢?我才恍然大悟,这样直接将叶子节点的值加到父节点上,逐渐累加上去,最后就可以比较根节点的左右孩子谁的子孙多了,省却了额外空间的消耗。
    这一题面试官说我们从一个实际中的业务需求抽象到所学到的知识,再利用算法去解决一个实际的业务需求问题,这就是在实际中如何将自己所学到的知识用到实际中去,我是真的挺喜欢面试官这种循序渐进的方式。

  • 接上一题,如果对上述的家族成员进行编号,你觉得什么方式比较好?
    这个我当时答到要用到huffman编码问题,面试官满意的点点头就没继续问了,说实话真细问我也忘了具体怎么办了(%>_<%)。

  • 假如有现场这些开着的灯有各种类型,比如红的,黄的,白炽灯等等,如何对这些灯进行抽象?
    这一题考察了面向对象的抽象问题,面向对象真是没白学啊,我答的是这些灯的基本属性要抽出来作为基类,比如开灯,关灯,灯亮灯灭啊这些,然后不同种类的灯都需要继承他们,然后去实现自己的各自属性。这题不算难吧。

  • 假如一个黑盒,我们知道它的状态包含A,B,C,D等,由A状态可以切换到B、C、D状态,其它的同样的道理,问我这个用什么设计模式比较好?
    想了半天没想起来该用哪种设计模式啊,对这种情形不太熟悉,面试官引导了半天也没答上来,然后这题就过去了,回来才发现有一个状态模式,但是还是不会,这个只能说是自己没掌握这种设计模式了。

  • iOS开发经常用到GCD,说说它的底层是怎么实现的?它的两种队列都用过么?
    这个当时答的不太好啊,两种队列倒是知道,但是实现这个GCD我之前看过,但是也忘记差不多了,就乱扯了一堆,面试官提示我说用NSThread,我就围绕这个说了自己维持一个队列啊,将代码块都放到这个队列啊,然后一个个执行或者同时执行啊,反正答的不太好。自己还是需要补补。

  • 假如使用GCD在一个线程里再去分发一个代码块到另外一个线程,会出现什么问题?就是下面:

 dispatch_aysn()
 {
     dispatch_aysn()
     {
         ...
     }
 }

这种情形,我一开始没摸到门道,经面试官提示说,最后终于想到可能会出现死锁问题,我恍然大悟啊,都是平时一些书里有,《Effective Objective-C 2.0》这本书建议大家看看。

  • 讲解OC里面的protocol和delegate?
    这个一般搞iOS开发的都会吧,没什么的,说说就差不多了。

  • NSRunLoop有没有了解过?

  • 内存测试有个有做过?
    我说有,MRC下内存测试还有泄露肯定要做检测,但是ARC下泄露问题减少了好多,但是内存使用问题还是需要考虑的,所以Instrument还是需要使用的。

  • 动画性能测试有没有做过?
    这个真没测试过,发现自己不会的好多啊…

  • 看看你做的APP。
    然后我就把自己写的APP拿出来给他演示了下,并且说了自己遇到的问题。这个我要强调下,如果你真的做过APP,并且是你开发的,一定要装到手机上拿给面试官演示下,不要给自己找各种理由说自己换手机啊,忘了装啊,因为我后续和做面试官的我的部门boss聊了这个问题。他说你没装,然后给自己各种理由会让他认为你有两点问题:一是你真的没做过;二是你对待本次招聘不认真。我们看你的App不是去评价它的好坏,也是为了看你在做这些东西中间如何思考的。所以,不要在简历上灌水。

后面还有二面的内容,我后续会慢慢补充。后面还有和部门boss聊了一中午得到的收获与感悟,也会分享出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值