记阿里Java研发应届生电话面试

首先感谢王同学给了我这次内推的机会,让我免遭笔试的虐待。。。。。。

我目前大三,在北京一家互联网公司实习。
下午正在公司上班,突然接到北京的一个陌生号码。于是去公司外面走廊接之。
卧槽,是阿里的电话面试! 根本没有任何准备,也没想到会这么早就电面!硬头皮上吧。

整个电面持续了大概一个小时,面试官是个年轻的男性(感觉),主要问了以下几方面的问题:

  • 对于以往做过的项目,挑一个最有成就感的谈谈
  • 谈谈你对软件架构方面的了解
  • 一道算法题目
  • 进程和线程的区别,什么时候用多进程,什么时候用多线程
  • JVM的内存模型,GC方面的内容
  • 未来的职业规划
  • 阿里总部在杭州,你为什么在简历上写喜欢北京

整体感觉答得还不错,尤其是项目经验、软件架构、算法方面,我回答的内容大概是:在最近的一个项目中使用了Nginx作为负载均衡、反向代理服务器,上游部署了2台Tomcat, MySQL数据库读写分离,还部署了Redis作为数据库缓存。另外我还补充了一句未来打算使用数据库中间件来更好的进行分流,拆库拆表。然后面试官问我如何才能做到高可用,我说通过集群来避免单点,Tomcat, MySQL, Redis都可以做到集群部署。

算法方面,面试官电话里出了一个并不很难的算法问题(不涉及贪心、动态规划和复杂的数据结构):
现在有一个单向链表,链表结点里保存了一些数据。现在给出一个数据,我想查找它在链表中的位置。(我一听这TM太简单了吧,心里一乐) 面试官顿了顿接着说,这不是重点,重点是我想查找这个数据所在结点的第前N个结点的值。

听完问题的第0.5秒我想的是通过前指针向前搜索,但是链表是单向的且不允许修改数据结构。第1.5秒我跟面试官说可以用一个长度与N相等的队列来保存已经访问过的结点,每访问一个结点,将该结点的值入队,队满时将最老的结点出队。这样当搜索指针命中目标结点时,队列出队的值就是我们想要的。

面试官听了并不满意,说这个单向链表可能会非常长,比如几亿个结点,N的值也非常大,用队列的话会消耗大量的内存。

不记录访问过的结点的话该如何找到第前N个结点呢?然后我脑洞大开,心想是不是想考我用二叉搜索树进行搜索?于是我问这个链表可不可以进行排序,面试官回答不行。我又开脑洞想,是不是想让我把链表转换成图然后再BFS,DFS遍历这种意思?还好我及时打消了这种将问题复杂化的念头,想着要用最简单的方法解决问题。这时候面试官说了一句话:“你慢慢想,不用着急。”大概考虑了1分钟的样子终于有答案了:定义两个指针,A指针从头开始遍历结点,搜索要找的结点,同时保证B指针始终与A指针保持N个结点的距离。这样当A指针命中结点时,B指针指向的值一定就是我们想要的了。

面试官对这个答案很满意,于是算法阶段就pass了。

然后又问了一些JVM内存泄漏、垃圾回收方面的问题,还好我研读过《深入理解JVM》,这些问题都回答上来了。又问线程跟进程有什么区别,这个回答得还不错,但是问我什么时候适合使用多进程,我就抓瞎了。我从来没用过多进程并发啊!于是我说了说多进程内存空间是独立的以外就没得说了。最后问我职业规划,我balabala说了一大堆,什么程序员,架构师,总监,CTO等等。

然后电面结束,等待通知。

你可能感兴趣的:(记阿里Java研发应届生电话面试)