首先说说结果。前三面通过,最后HR面挂掉了。一路走来虽然跌跌撞撞,但是收获颇多。写一篇博客记录一下自己的阿里面试之路。
提一下背景,双非渣本大三,大一大二学C/C++,大三开始学Java,有参加竞赛,不过功力目前也就水赛省一水平23333。
今年开学才几周,老师发给我了百度实习生招聘的消息。抱着试一试的态度,用一晚自习的时间做了一份简历,然后投了百度。投完百度之后,突然想起心心念念的阿里,就又去投了阿里的Java研发岗。当然还是更爱阿里啦哈哈哈。
百度最后好像连简历筛选都没过吧,通知笔试之后就没动静了。然鹅个人觉得百度的笔试答的比阿里还要好一些。
投完阿里简历之后,20号就邮件通知了在线素质测评。素质测评大概就是分为逻辑思维题,数据分析题,智力题和性格测试题吧。不到一个小时就能做完。
等到4月8号又通知了进行在线模拟笔试和4月12号的在线笔试。
笔试是十道选择题和两道编程大题,时间是90分钟(选择题30分钟,编程题60分钟)。
说实话选择题覆盖面很广,JAVA基础只有很小一部分,更注重考察逻辑思维和分析能力。举个例子:考了池化和卷积(黑人问号???),根本没接触过。做的马马虎虎,大题也只完成了一道。
笔试完后,感叹自己还是太菜。毕竟程序设计,菜是原罪。本以为药丸,结果4月24号一面面试官打来电话,要进行电话面试。于是立马找了个安静地方进行一面。
面试的部门是阿里优酷院线的一个部门,面试官先简单的给我介绍了一下他们这个部门,依稀记得是做高并发和分布式服务的(可惜没有录音)。然后让我做了一个自我介绍,因为之前也有过一点面试经历,所以自我介绍这个流程还是比较熟悉,说的马马虎虎。然后面试官开始提问:
1.介绍一个竞赛或者项目经历
因为所做项目大多都是培训或者教学项目,所以没有说项目。讲了第一次参见数学建模大赛的经历。这里我个人推荐面试前还是好好回想一下自己做的东西,简单看一看。虽然都是自己做的,但到了面试的时候不一定能说得清楚。
2.个人的优势所在
大概说了下因为大学期间有参加竞赛之类的。所以逻辑思维能力和自学能力比较好,有优化代码和算法的意识之类的。还有一些日常编码的习惯什么的。其实相对大牛们没有太多拿得出手的东西。所以说了一些软技能吧。
3.多个无序数组排序成一个数组
这个问题第一反应是考虑对每个数组快排,然后再对排序好的若干个数组进行插入排序
面试官继续提问:对于这个问题采用各种排序的优劣?
考察八大排序算法吧,简单说了说常用的几个:快排、插排、堆排、桶排的区别呀blabla,然鹅对于这个问题我觉得自己的思路没有太大问题了,所以回答没有太答到点子上。
面试官又继续提问:如果单机无法容纳,怎么办?
单机无法容纳,当然考虑分布式啦。将多个数组放到不同的机器上进行快排,然后插入排序得到一个大数组,最后在一个中央机器上进行插排。因为没有接触分布式,所以想当然的这么去回答的。
面试官又又继续提问:多并发怎么划分数组?
回答使得每个机器上的数组规模尽量平均,防止出现热点。
面试官又又又继续提问:怎么处理链路交互?
好了,这就触及到我的知识盲区了。蒙了一手zookper,然后面试官果然没有继续深入了。
4.Java集合框架中有哪些是基于树实现的?
TreeSet/TreeMap/SortedMap,底层都是红黑实树实现的
其实并没有太深入的去看红黑树。所以就说大概知道底层是一个平衡二叉树。
面试官继续提问:如果这个树不平衡的话怎么办?
后来翻了翻资料,看到可以用AVL算法,或者红黑树算法使其继续保持平衡。但之前确实没有研究过,所以就说了一个自己的实现思路:大概就是每个节点都是双向链表,当树不平衡时,使root指向一个中间值的节点,然后整个树平衡了。
面试官又继续提问:是否了解B树,B+树?
只知道MySQL索引是B树和B+树构建的。然后面试官就没有继续问下去。
4.是否了解Java锁机制?
排他锁、共享锁、同步锁、异步锁、乐观锁、悲观锁,然后简单谈了谈对乐观悲观锁的看法。
5.线程、进程的了解,是否了解协程
说了说线程进程,但是协程有听过,但并不了解。
面试官继续提问:说说Java中的线程和数组记账线程的区别?
数组记账?嗯?黑人问号。然后面试官提醒了是操作系统中线程。然后简单说了一下JVM是作为一个进程存在的,JVM中的所有线程都是用户线程,但数组记账线程可能是系统线程。继续说了一些系统线程用户线程区别啥的。
面试官又继续提问:有没有做过多线程的程序?
做过小demo,关于一些经典的操作系统问题——哲学家问题、读者写者问题。一般来说demo的话面试官就不会深问了,可能在面试官眼里做过小Demo约等于不会。
面试官又继续提问:谈谈对同步、异步的使用的理解?
谈了谈它们的定义,还有什么情况下去使用。又举了例子,比如AJAX就是异步访问,然后哲学家进餐问题里因为临界资源的限制,就必须考虑到同步。
一面大概就是这些,然后约了4月25号下午的在线编程。题目是求数组TOP N。用系统自带排序实现,自己写块排实现,然后利用小根堆实现。最后还用注释写了在分布式的场景下怎么利用多台机器完成这个问题。
后来上网查了一下,阿里一面一般是简历筛选面,不怎么挂人。主要问的就是一些算法思想,集合框架,线程这类问题。
4月25号完成了在线编程,紧接着4月26号中午就打来电话进行电话二面。
电话二面一开始就是唠嗑,问了问竞赛经历,然后问现在主要在做什么。我回答大一大二做C/C++方向的竞赛,大二下学习了JAVA,大三开始主要做JAVA方向。目前还在学习,以后也准备继续做JAVA开发。
于是面试官就开始问Java方向的一些问题。
1.对final关键字的认识?
面试经典问题...分别可以修饰类、方法、属性。作用是blablablabla.....
2.抽象类和接口的区别?
面试经典问题+1...分别从关键字、构造方法、成员方法、成员属性还有意义这些方面去谈就好。
3.List和Map的区别?
面试经典问题+2... List继承了Collection接口是单列的,有序的
Map则是键值对的形式,无序的
当然对于他们具体的实现类这个说法也并非那么准确,然后讲了下集合框架的体系结构
那你说一说HashMap和HashTable的区别?
当然是从实现、初始值、扩容因子以及底层来进行区分,这里也不再赘述
面试官继续追问:具体说一说HashMap底层?
以HashCode和equals进行排序,知道底层是红黑树,但并不太清楚其算法实现。当然这个说法后来我也发现不对,其实如果相同HashCode的数据小于8的话,还是采用拉链法去存的。大于8才转化为一棵红黑树。
4.Java中的复制的了解,是复制引用还是复制内存?
如果是clone的话,那么就是对对象进行整体复制。否则对于引用类型就是复制引用,对基本类型复制内存中的内容。
5.谈一谈JVM内存区域?
正好写过一篇博客。然后把类加载器,运行时数据区,执行引擎都说了一遍。当然有所欠缺。
面试官追问:谈一谈GC进行内存回收的划分?
之前没有太深入的去了解堆内存,知道有新生代,老年代,新生代又分为两个部分blabla,吧自己知道的关于GC和堆内存划分的点都说了一遍。
6.了解网络编程么?
知道Socket和Packet这些,也做过一些小demo。但实在没有太多的去学习。。。直接交底。如果需要可以下来进行了解,然后面试官笑了。。。果断结束这个话题
7.是否使用过IO和NIO?
不了解NIO,但了解IO流。。。也做过一些小的demo
面试官追问:具体实现了那些功能呢?
文件拷贝、遍历blabla 总之不是很深入,于是果断结束这一话题
下面是核心啦,主要考察算法思维和数据结构的了解。
8.给你一个单链表,可以得到某个节点的引用,怎么去删除它(O(1)复杂度)?
一开始理解有误,如果是上一个节点的指针的话,直接将它的引用替换为该节点引用域的引用,然后就指向了下个元素。
面试官补充:现在是只知道这个节点,怎么办?
空气凝固了半分钟,想了想直接把后一个节点的值域和指针域直接复制过来就好啦,相当于覆盖了该节点。当然后一个节点的空间也得释放掉。
面试官问:你觉得这个思路可行么?
当时觉得好像没什么大问题,就说应该是可行的。然后面试官就没有多问。现在想来如果该节点是尾节点的话,还需要进行特殊处理。
9.要生成一个全是括号的文档,括号有大括号,小括号和中括号,长度为8。如果括号不能匹配,那么就是错误的。要求出所有正确的的可能。
听到这道题,以为核心是判断括号匹配。因为编译原理做编译器的时候,写过这个括号判断,就说了思路。用一个栈存放括号,如果当前括号和栈顶括号不能匹配,就压栈,否则就将栈顶弹出,表示完成一次匹配。如果到最后,栈不为空,说明这个情况是错误的。
然后面试官问怎么才能生成所有的括号组合。脑子一蒙,说了个八重for循环...因为C++里有自动生成下一组组合情况的函数。但JAVA里也不能用,就回答了这个思路。
后来一下,还可以用数位的方式生成组合。但是复杂度还是高,应该还有在生成括号的时候就能判断是否正确的方法。但我没想到,就没说。
10.如何按层遍历并输出一棵二叉树?
当时第一个思路就是广度优先,维护一个队列。然后按层输出。这个思路应该是可行的,跟面试官将了一下。
然后面试官将需求改为:如何按层遍历并输出一棵二叉树,并且每层按Z字型输出?
第一反应还是广度优先,队列存节点。计算该层长度,每偶数行就从尾向前遍历输出。这样就能按Z字输出二叉树。
但是面试官提醒,队列不能直接访问某某位置。只能在两端操作。
于是略加思索。考虑使用两个栈,第一个栈读根节点,输出值,然后将左右支压入第二个栈。一输出后,弹栈。栈二中保存第二层的节点。然后依次遍历值,读左右支压入栈一...如此反复。由于栈先进后出的特性,这样进行每层遍历的结果就是Z字型的。
面试官问:你觉得这个思路可行么?
我想着反正也没别的思路了,就说应该是可行的。
最后我向面试官提了两个问题,二面结束。
总的来说二面考察的主要是Java基础和思考能力,一步一步引导面试者去解决问题。算法、数据结构、集合框架、网络编程、多线程、IO流还是重点。
三面是5月6号打来电话的,当时才回学校,状态不好,正吃着泡面。所以果断推到第二天午进行。
面试开始先向面试官道了个歉,说明了一下自己推迟面试的原因。然后就开始面试了。
一开始让做自我介绍,因为好像是交叉面,所以先让做了自我介绍。然后谈到以后准备做Java后端方向,所以开始问了一些基础知识。
基础部分的问题如下:
1.接口和抽象类区别
2.NIO和IO(只做过DEMO)
3.网络编程(只做过DEMO)
4.进程和线程
5.JVM和GC(恶补一番,基本上都回答了)
6.网络协议ARP,ICMP,DNS,作用以及它们所在的层?(没答好)
7.TCP和UDP协议的区别,日常看视频之类的是用哪个?(答的不全)
最后是三个编程题:
1.如何判断一个链表是否成环?
很久没用一时想不起来了,用邻接矩阵,出度-1入度+1,最后度不为0就说明成环。
面试时提的给链表节点编号。如果下一个节点的号码小于当前节点,说明有环。但好像不对。就摊牌了,说没有别的思路了。
2.从一万个字符串里找出出现次数前十的字符串。
第一个想法就是用TOP N的算法,建立小根堆并维护他,节点是自己写的类,包含字符串和计数器。然鹅面试官指出,小根堆中的字符串可能会被过早的淘汰。于是考虑从头到尾遍历一次,得到每个字符串出现的次数,然后进行一次排序,得到最大的十个。但感觉思路不够好,应该有更好的解法。但没想出来哈哈哈。
3.两个文件,各1亿个Cookie,比较哪些Cookie是相同的。只有100M空间。每个Cookie 32K。
第一个想法就是把文件一放到Set中,然后用第二个文件中的Cookie依次去看是否包含。
然后面试官提示,内存不够。
然后就想着把Cookie都转化为HashCode再进行上述操作。
然后面试官再提示,内存不够。
思来想去,动态规划、字符串比较...各种会的不会的算法...但是要么时间复杂度太高,要么空间会超。
面试官看不下去了,直接提示用外排。
???外部排序我知道,但我没用过呀....根本没有处理过那么大的数据,都是读到内存中处理。
然后摊牌了说外排我没有用过。
面试官说没用过的话可能这道题对你比较困难...下来一查思路特别简单,用外排对两个文件依次排序。然后对两个排序好的文件找相同项,就不难了。从文件一第一个Cookie开始,如果在文件二中从头至尾能找到。那么取出文件一第二个Cookie,继续从文件二刚才的位置向下查找。
然后三面大致就是如此...总体的发挥并不满意。
本以为三面要凉,结果过了一周。5月13日,HR小姐姐打来了电话。
接到HR面的电话,第一反应就是兴奋...因为内心想着HR面基本上就是过了,况且我的简历一丁点儿水分都没有(因为听说大公司背调比较严格)。
先是进行了自我介绍。
然后HR小姐姐问了参加过的项目或者比赛。
我仍然举的是第一次数学建模的经历,然后谈到了一些实现思路,还有比赛分工,我的角色和定位之类的
HR小姐姐继续问对考研和专业就业的看法。
我以道哥和王坚博士的例子说明了一下,升学或者工作其实都能有很好的发展,主要是看自己。
HR小姐姐问了有没有经历过什么或打击的时候
因为经常出去比赛,所以知道大牛和自己的差距,所以经常被打击。但是能看到差距才是好的,能更加激励自己。
HR小姐姐又问了入职时间之类。
因为才在大三下...所以说的可能要八月份才能正式入职。
总之HR面就是唠嗑吧,没有什么特别的东西。
本以为能过,因为我表达能力还是不错。然后等了有一周吧,上周末打开手机查面试流程...已回绝
自己回想了一下,可能还是三面表现的不太理想,而且还有更厉害的人选。或者就是入职时间太晚,等不了。因为不是内推。所以也没有可以帮着问的学长学姐。
最后还是要做一个总结,谈谈需要注意的地方。
1.电话面试一定要进行录音,方便日后复盘。
2.面试前后手机一定要保持开机,且有铃声。保证能及时接到电话。
3.最好准备一到两个项目或者比赛经历。方便面试问到的时候可以更好的回复。
4.注意讲话要有条理,表达能力也是很重要的一环。
5.数据结构、算法、计算机网络、操作系统、数据库这些基础课程相当重要,基础一定要牢固。
6.多看源码,多理解底层原理。
7.学习不应该只做一个demo,有条件的话最好将其转化为一个小的项目。比如利用网络编程做一个聊天室,用NIO做一个远程文件传输软件。不仅能加深知识的理解,也能在面试的时候增光添彩。
继续努力,继续加油。阿里爸爸,位置留好,我秋招再来~
加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油加油!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!