前言
今天是我正式入职快手的一个月零一天,粗略地统计了一下,算上各种面试(技术面+HR面),春招一共经历了23场面试,通过了三家大厂的技术面,最终选择了快手。我觉得还是有必要对春招做个记录,就当是面经吧。
春招真题
由于距离春招已经过去差不多两个月的时间了,我记得也不是很全了,不过我感觉现在的Android的面试题基本都差不多。我下面将分为八股文系列、设计优化类题目、算法以及项目经验分别给大家记录一下。
八股文系列
- 介绍一下Https原理,哪个阶段使用了非对称加密,哪个阶段使用了对称加密,讲一下E-Tag机制?
- Java中有几种对象引用,它们的使用场景分别是什么?
- 启动一个Java线程会占用多少内存?了解垃圾分配器的运行机制吗(注意不是垃圾回收器)?
- 在Java中哪些对象可以成为GC ROOT,为什么?
- Java如何保证线程安全,都有哪几种方法?volatile关键字有什么用?介绍一下各种线程锁以及锁升级的过程
- 介绍一下Java线程池的作用,以及各种参数的意义?当最大线程数和队列都饱和时,再添加任务会发生什么?
- 介绍一下Hashmap的底层结构,讲一下扩容机制,当发生hash碰撞时如果当前的数据结构是链表时,新增加的数据会添加到链表头部还是尾部,为什么?
- 介绍一下ThreadLocal 原理
- 介绍一下Java的静态代理和动态代理机制,二者有什么区别?使用场景分别是什么?
- Kotlin的lambda表达式跟Java有什么不同?原理是什么
- 介绍一下Kotlin的泛型
- Kotlin的协程有使用过吗?什么叫非阻塞式?跟Java的线程相比有哪些优点?
- Kotlin的扩展函数原理是什么?
- Handler会造成内存泄漏,内存中的的引用链是什么样子的?如何避免?介绍一下Handler的消息屏障以及IdleHadler?
- 讲一讲LeakCanary的源码?它是如何做到可以监测内存泄漏的?
- Activity的启动流程,中间经历了几次跨进程操作?
- 如何监测整个APP线程的启动和销毁?
- Touch事件传递机制,怎么处理滑动冲突?(一般会举个具体的场景让你分析)
- View的绘制流程
- 跨进程通信有几种方式?Android为什么选择Binder机制?了解什么是OneWay吗?
- gradle打包流程是什么样子的?
- 讲一下RecyclerView的缓存机制
- 讲一下你熟悉的第三方库的源码(Butterknife、EventBus、RxJava等等....)
........
这些是我还记得的部分,实际上比这要多,但是我感觉八股文系列都差不多,而且也是最简单的,为啥呢?因为可以背啊。大厂的面试官们也发现了这个问题,所以他们接着出了设计优化类的题目。
设计优化类题目
- Android为什么会发生ANR?设计一个监测ANR的框架
- 设计一个APP启动框架,可以定制任务的启动顺序以及启动时间
- MVP和MVVM有什么优缺点?利用MVP架构设计一个弹幕框架
- SharedPreferences的原理,有哪些可以优化的点?
- App启动速度优化、包体积优化、性能优化各种方案讲一讲
- 设计一个内存泄漏监控框架
- 如何监测一个View的卡顿,怎么优化?
- 以歌手和经纪人为例,手写代理模式
其实我个人还是比较喜欢这种设计和优化类的题目,因为它能比较好地反映出一个面试者的设计思路。一般设计类的题问完就该算法了
算法题
- 手写快速排序
- 如何判断一个单链表是否有环(要求:空间复杂度 O(1)级、时间复杂度胺O(1)级)
- 给定一个数组,计算数组中左边比当前数字小的数的总和(要求:时间复杂度O(logN))(这个应该是面试官自己编的题,其实就是数组小和问题,核心点就是归并排序)
- 之子行打印二叉树,奇数排正序,偶数排逆序
- 判断两个链表是否相交(需判断有环和无环的情况)
- 删除一个ViewGroup中所有的Button
- 给定一个字符串,计算最长无重复子串
- 以一定规则压缩字符串,要求将压缩的字符串翻译过来(应该是面试官自己出的题,具体的内容忘了,核心就是搞一个栈存数据,再做一些特殊的标记判断)
- 链表中的节点每k个一组翻转
- 二叉树翻转
- 删除链表中K的节点
- 打印一个二叉树中的最长路径
......还有一些,记不住了
关于算法题一定要去学、去刷,因为有些算法题如果不去学的话,你面试的时候有可能写得出来,但很可能不是最优解。举个例子,比如说判断单链表是否有环问题,如果搞个HashSet之类很轻松就解决,但是搞了HashSet的话,空间复杂度一下子就变成O(n),这个时候你如果不了解快慢指针这个概念的话,很难写得出最优解,所以算法是必须要去学和刷的。
说来有些惭愧,看脉脉上的大佬说跳槽算法题基本要刷200道,我其实就刷了50道,不过也挺幸运,我遇到的算法题相对都比较简单,基本都做得出来。我其实更想说的是,如果你想跳槽去大厂,那么算法题是必备的了,我参加的几乎所有的技术面都会考算法题,没办法,现在计算机那么内卷,不会算法真的不行。有些人说算法只有跳槽的时候用得上,平时用不上,所以学算法没用。其实我是不同意这种观点的,虽然说算法的确平时工作用的不多,但是只要是算法学得好的人,代码一般都写得很漂亮。我之前在大学的时候搞过算法,参加过蓝桥杯还拿过省三,工作之后基本就扔了,重新捡起来的时候还是从中学到了很多知识,扩宽了自己的思维。关于算法我会一直坚持继续学下去,而不是跳槽的时候才想来,未来有机会的话会出一些关于算法内容的文章。
项目经验
到了这里,就没有设么真题给大家看了, 因为每个人做过的项目都不一样,而我认为整个面试最困难的地方就是这里。你看哈,八股文、设计类题目还是算法题也好,其实你都可以通过训练或者学习的方式搞定,但是项目经验这块就比较麻烦了,因为有可能你之前待过的公司DAU没那么高,需求复杂度也没那么高,你平时又做的是大头兵的工作,没什么亮点很难抓住面试官的心。而项目亮点和难点往往是越到后面大leader越喜欢问的,所以这里没什么特别好的办法,就是平时工作时主动承担一些挑战性的任务,多学习扩充自己的领域。另外,还有人说这里可不可以造假,找一个复杂的功能说是自己完成的,我个人是不建议的,因为面试官一般是比较厉害,会问的也就比较深,如果不是你做的内容你说成自己的很可能翻车,当然高手可以忽略,怎么来都行。
最后
毕业工作五年了,一路走来,终于完成了自己入职互联网大厂的梦想。其中诸多不易,而最难的是走出自己的舒适圈。我跳槽前之前在青岛,结婚了有车有房,工作也不错,没什么压力,快三十了按理说应该平淡地进入我的养老生活。但是去互联网大厂这件事就好像是我的一个执念,如果不完成就感觉人生充满了遗憾,在这里我要特别感谢我的老婆,在家人都不支持我的情况下,只有我老婆坚定地支持我,陪我放弃了青岛安逸的生活,一起来北漂。我一直都觉得自己很幸运,有个爱我又懂我的老婆。这个世界上只有一种成功,就是按照自己喜欢的方式过一生。愿大家都可以为了自己的梦想努力,所得皆所愿。
网友评论