一路走来也遇到很多困难,也踩了很多坑,同时我自己也探索了很多的学习方法,总结了很多心得体会,并且对面试这块也做了一些研究和相应的准备。
这里分享面试阿里、头条、腾讯的经过以及一些总结
面试岗位是研发工程师,直接找蚂蚁金服的大佬进行内推,参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头 offer。
一面:
自我介绍
项目中做了什么,难点呢。
Java 的线程池说一下,各个参数的作用,如何进行的。
Redis 讲一下
分布式系统的全局 id 如何实现。用 zookeeper 如何实现的呢,机器号+时间戳即可。
分布式锁的方案,redis 和 zookeeper 那个好,如果是集群部署,高并发情况下哪个性能更好。
kafka 了解么,了解哪些消息队列。
想做业务还是研究。
然后出了一道题,linux 的访问权限是 rwx 格式的。使用一个类支持访问权限的增删改查,并且注意使用的数据格式以及方法效率,规范。给了一个多小时写题。
耗时将近 30 分钟。
二面:
介绍你做的项目和其中的难点。
上次面试官问的问题,反射的作用是什么。
数据仓库,多线程和并发工具等。
私有云,docker 和 k8s 等。
了解哪些中间件,dubbo,rocketmq,mycat 等。
dubbo 中的 rpc 如何实现。
自己实现 rpc 应该怎么做
dubbo 的服务注册与发现。
听说我是非科班,于是问了些排序算法
耗时将近 30 分钟。
三面:
三面不是面试,而是笔试,耗时三个小时,考的是 Java 核心的基础。但是好像不能透题,就不说了。都挺有难度的。
大概说一下就是有几个考点,Java 并发的知识点,集合类,线程池,多线程之间的通信等。
HR 面:
聊人生谈理想,HR 小姐姐非常温柔,交流十分愉快。30 分钟。
面试岗位是后台开发工程师,我没有选择意向事业群。
SNG 的部门捞了我的简历,开始了面试,他们的技术栈主要是 Java,所以比较有的聊一共经历了四次技术面试和一次 HR 面试,拿到 offer。
一面:
有序数组排序,二分,复杂度
常见排序算法,说下快排过程,时间复杂度
有 N 个节点的满二叉树的高度。1+logN
朋友之间的点对点关系用图维护,怎么判断两人是否是朋友,并查集,时间复杂度,过程。没讲清楚
单元点最短路的方法,时间复杂度
如何实现关键字输入提示,使用字典树,复杂度多少,有没有其他方案,答哈希,如果是中文呢,分词后建立字典树?
hashmap 的实现讲一下吧,讲的很详细了。讲一下红黑树的结构,查询性能等。
Java 中的垃圾回收讲一下,讲了分代,gc 算法,gc root 可达性分析等
讲一下两个项目你都做了什么把。
除了代码之外你还学习了什么技术,框架。
死锁是怎么产生的
线程和进程的区别
进程的通信方式
CPU 的执行方式
代码中遇到进程阻塞,进程僵死,内存泄漏等情况怎么排查。通过 ps 查询状态,分析 dump 文件等方式排查。
Linux 了解么,查看进程状态 ps,查看 cpu 状态 top。查看占用端口的进程号 netstat grep
10g 文件,只有 2g 内存,怎么查找文件中指定的字符串出现位置。MapReduce 分割文件处理。
二面:
快排的时间复杂度,冒泡时间复杂度,快排是否稳定,快排的过程
100w 个数,怎么找到前 1000 个最大的,堆排序,怎么构造,怎么调整,时间复杂度。
一个矩阵,从左上角到右下角,每个位置有一个权值。可以上下左右走,到达右下角的路径权值最小怎么走。
四辆小车,每辆车加满油可以走一公里,问怎么能让一辆小车走最远。说了好几种方案,面试官引导我优化了一下,但是还是不满意,最后他说跳过。
hashmap 的实现,hashtable,concurrenthashmap 实现。
MySQL 的索引,B+树性质。
Linux 的 cpu 100 怎么排查,top jstack,日志,gui 工具
Linux 大文件怎么查某一行的内容。
Redis 内存数据库的内存指的是共享内存么
Redis 的持久化方式
秒杀系统的架构设计
三面:
十亿个数的集合和 10w 个数的集合,如何求它们的交集。
十亿和数找到前 100 个最大的,堆排序,怎么实现,怎么调整。
TCP 和 UDP 的区别,具体使用场景呢。
TCP 四次挥手讲一下过程,最后一次 ack 如果客户端没收到怎么办。
对于 socket 编程,accept 方法是干什么的,在三次握手中属于第几次,可以猜一下,为什么这么觉得。
Linux 操作系统了解么,了解一点点,就没问了。
对于单例模式,有什么使用场景了,讲了全局 id 生成器,他问我分布式 id 生成器怎么实现,说了 zk,问我 zk 了解原理不,讲了 zab,然后就没问啦。
除了单例模式,知道适配器模式怎么实现么,有什么用
回到网络,刚才你说到直播场景,知道直播的架构怎么设计么,要点是什么,说了几个不太对,他说要避免广播风暴,答不会。
Redis 和 MySQL 有什么区别,用于什么场景。
问了一下最近看什么书,什么时候开始写博客的
问了还有几轮面试,他说这轮我可以过,有点小惊喜
四面:
三面过了半个多月,终于安排四面了。
自我介绍
项目,收获
Linux 了解哪些,基础命令和知识。问我 proc 文件系统了解么,答不了解。
TCP 和 UDP 的核心区别在哪,讲了滑动窗口保证可靠有序传输,UDP 不可靠。TCP 需要连接而 UDP 不需要。
TCP 的四次挥手,time wait 状态有什么意义。
说完这个他问我有什么想问他的了。
我问他为什么隔了这么久才面试,而且之前三面都只是初试,然后他说最近他在休假,所以就。。。害我担心了好久。他说接下来等 HR 面就行了。
HR 面:
自我介绍
实习收获
台湾交流体验
之前实习公司的情况,拿到 offer 了吗,会如何选择呢
排一下公司,部门,薪资和城市等因素。
你的优缺点,如何改进
学生时代最成功的事
你的预期薪资
面试岗位是后台研发工程师,地点选择了上海,通过大佬内推,跳过死亡笔试,直接视频面,从 3 点开始,断断续续到晚上 8 点结束。
一共三轮技术面试,每一轮都要写代码,问问题的风格有点像腾讯,也喜欢问一些底层知识,让我有点懵逼。
一面:
写一个题,找一个无序数组的中位数
写了个快排,然后让我找到无序数组第 k 大的一个数,我说先排序再找,实际上可以用快排的 partition 函数。
快排的时间复杂度,最坏情况呢,最好情况呢,堆排序的时间复杂度呢,建堆的复杂度是多少,nlgn。
操作系统了解么,Linux 和 windows
说说 Linux 的磁盘管理,一脸懵逼
Linux 有哪些进程通信方式,五大件
Linux 的共享内存如何实现,大概说了一下。
共享内存实现的具体步骤,我说没用过
socket 网络编程,说一下 TCP 的三次握手和四次挥手,中间网络不好,面试官都没听清楚,很尴尬
跳过网络,问了项目的一些东西
问我如何把 docker 讲的很清楚,我从物理机,虚拟机到容器具体实现稍微说了下。
问我 cgroup 在 linux 的具体实现,不会。
多线程用过哪些,chm 和 countdownlatch 在实习用过
二面:
自我介绍
Java 的集合类哪些是线程安全
分别说说这些集合类,hashmap 怎么实现的,扯了很多
MySQL 索引的实现,innodb 的索引,b+树索引是怎么实现的,为什么用 b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。
MySQL 的事务隔离级别,分别解决什么问题。
Redis 了解么,如果 Redis 有 1 亿个 key,使用 keys 命令是否会影响线上服务,我说会,因为是单线程模型,可以部署多个节点。
问我知不知道有一条命令可以实现上面这个功能。不知道
Redis 的持久化方式,aod 和 rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么,不清楚。
Redis 的 list 是怎么实现的,我说用 ziplist+quicklist 实现的,ziplist 压缩空间,quicklist 实现链表。
sortedset 怎么实现的,使用 dict+skiplist 实现的,问我 skiplist 的数据结构,大概说了下是个实现简单的快速查询结构。
了解什么消息队列,rmq 和 kafka,没细问
写题时间到。第一题:写一个层序遍历。
第二题:写一个插入树节点到一颗排序树的插入方法,使用递归方式找到插入位置即可。
第三题:一个有向图用邻接矩阵表示,并且是有权图,现在问怎么判断图中有没有环。
第四题:一个二叉树,找到二叉树中最长的一条路径。
三面:
三面的面试官真的高冷啊,不苟言笑就算了,我问他他都不爱搭理的,搞得我内心慌得一比,感觉凉凉。
1 介绍一下项目
2 你谈到的并发技术,chm 和 countdownlatch 怎么使用的
3 为什么要这么处理,使用线程池是不是也可以。我说也可以
4 操作系统的进程通信方式,僵尸进程和孤儿进程是什么,如何避免僵尸进程,我说让父进程显示通知,那父进程怎么知道子进程结束了,答不会。
5 计算机网络 TCP 和 UDP 有什么区别,为什么迅雷下载是基于 UDP 的,我说 FTP 是基于 TCP,而迅雷是 p2p 不需要 TCP 那么可靠的传输保证。
6 他说不对,我说是不是因为要建立连接,开销比较大,他说不对
7 我说 p2p 的发送节点很多,所以不是那么需要各种传输保证,他说不对。
8 我说 TCP 会自动分包而 TCP 可以自己定义数据长度。。他还是说不对。
最后他说算了。我们问下一个吧。
9 操作系统的死锁必要条件,如何避免死锁。
10 写一个 LRU 的缓存,需要完成超时淘汰和 LRU 淘汰。
我说用 lhm 行不行,他说用 linkedlist 和 hashmap 可以。
于是我就写了 put 和 get 函数,进行了队头队尾操作。
他说 get 复杂度会不会太高,我瞎掰了半天没找到办法,他说那就这样吧,今天面试到这。
11 妈蛋,过期淘汰的处理我还没写呢,你就说结束了,感觉凉了啊,我说我要不要把剩下逻辑下完,他说不用,心凉了一大截~
然后就是 HR 小姐姐让我等结果了。溜了溜了
最后,强调几点:
1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
3. 注意自己开源的 Github 项目,面试官可能会挖你的 Github 项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目