机缘巧合看到了美团的招聘信息,有明确要求能熟练使用linux,vim和git,跟对方简单说了下我的情况后,发了简历过去,我没有大数据开发经验,Python和Shell也不熟练,对方可能从我的博客和github上看到我对软件开发的兴趣与激情,愿意给我面试机会,很快,部门另外一个同学和我约了面试时间.
一面:
一面的面试官应该是在群里和我联系的同学,问了几个简单的问题就结束了,第一个问题是linux下统计文件夹占用磁盘空间大小的命令du -sh
;第二个问题是查看java进程的命令jps
;第三个问题是一个算法问题,公司组织聚会,每个员工不能和他的直接上级同时参加聚会,但可以他直接上级的上级一起参加,求最大的参会人数.没答出来,但基本思路已经说出来了,把每个员工的下级看成子节点,树dp求解;期间还让我介绍了自己觉得不错的一个题目,没答好,还让我介绍了项目,没有深究,一面结束,他说接下来会有远程写代码的面试,我还不是很相信,以为自己那个题目没做出来,应该挂了.
二面:
直接远程看我写代码,一定要注意对参数的合理性判断,如果不能对参数的合理性做判断,估计面试官怎么也不放心招这样的同学.
- 先来一个二分,我用的
mid = (left + right) >>> 1;
,他提示我当数组大小非常大时,这样有什么问题,我说应该改成left + (right + left) / 2;
后来自己实验了下,我的写法是没有问题的,无符号位移是可以处理越界问题的; - 对排序数组,给定sum,是否满足有两个元素之和等于sum,很常见的题目,写完代码后,让我证明.
- 多个小组参加比赛,所有小组排成一条直线,每个小组只知道与他相邻的两个小组的成绩,现在需要颁发奖金,保证每个小组至少1万,且每个小组的奖金是整数,单位为万,如果一个小组的成绩比他相邻小组的成绩高,那他的奖金也必须高于他.leecode上面动态规划题型里面分糖果那个原题.
- 给一组数据,从第三个位置开始,判断从第一个位置到当前位置能都组成多边形,第三个位置判断能否组成是三变形,第4个位置判断能否组成四变形.我不知道判断规则,面试官告诉我最大边的2倍小于剩余边之和,然后让我证明.
本以为再来一面就知道能不能过了,让我去北京总部现场面试,机会难得,必须去.
三面:
继续做算法题:
- 给两个排序数据,找出他们是否有相同数字,写代码.
- 水塘抽样问题,没答出来
- 给一个排序数组和sum,求任意元素和为sum的组合数,简单的dp问题,当时脑袋不好使,没答出来.
四面
这面有点像后台开发的面试了,不过挺喜欢,最后才知道这个面试官是另外一个部门的,我面试的部门主要用Python和Shell,大数据我又不会,看我主要使用Java,所以从别的部门找了 个面试官.
- ArrayList和LinkedList的区别,对我说的几个点问我却不确定?比如初始大小,扩容机制.
- HashTable和HashMap的区别,HashTable和ConcurrentHashMap的区别, HashMap的key冲突解决,ConcurrentHashMap的实现原理,两个线程set和get发生了key冲突,需要同步吗?
- Java线程的状态,画状态转换图,线程的启动方法,Java线程和操作系统线程的对应关系,线程start后可以被再次start吗,为什么?.
- wait和sleep的区别,对wait的对象调用notify后发生什么,一定会唤醒吗?synchronized和lock的区别?我说了细粒度方面,公平锁方面,可中断方面, lock怎么达到更细粒度的控制?
- 手写一个单例.
- 对象的初始化顺序
- 介绍Java的异常,如果异常没有被catch会怎么样?默认抛出,可以调用线程的静态方法setDefaultUncaughtExceptionHandler()来处理未被捕获的异常.
- finally的作用,如果在try里面return,finally里面可以修改返回值吗?分对象和基本类型,解释为什么?
- 问我后台框架会不会,我说没怎么用过,就没有问我了.
- tcp和udp的区别,为什么是3次握手.
- http和https的区别,http和websocket的区别.
- mysql的索引.
- 数据库引擎.
- 内联和左内联的区别,数据库还问了几个问题忘记了,我只打出了索引,说了下b树和b+树的区别.
总的来说,问的问题都很基础,也很注重细节,可能因为我是应聘实习生,面试官没有深究,比如jvm完全没有涉及.然后,美团的面试官真的超级nice,像我这种完全没有大数据开发基础的同学也愿意接收.
五面
这次应该是部门老大了,感觉少了点程序员的气质,了解了下我的情况,跟我说下过来工作的一些细节问题,轻松愉快的结束了面试,下午hr就通知我面试通过了.