面试经历之阿里云
Posted torrance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试经历之阿里云相关的知识,希望对你有一定的参考价值。
阿里云弹性计算团队春招实习内推面试+阿里云盘古团队秋招内推面试。
(实习内推面试挂在二面,秋招内推面试已经面完四轮)
首先是学长帮忙内推了他们组的春招实习,过程十分坎坷。18年春节前阿里云的一个SDN团队招实习生,我报名了,接受了内推,在第一次面试后就挂掉(不太明白为啥),但是由于每个人一个批次只能内推一次,所以内推学长组的时候,找了很久的客服,最后由于我的拒绝理由是转部门,所以可以第二次内推,总之十分艰辛。
实习内推一面(电话面试,大约1小时20分钟):
1. 自我介绍
2. 对着简历问,先问了几个STL的实现,具体记不太清楚了,后面问了几个TCP的问题,都比较简单。
3. 问到项目,首先是第一个项目让我讲了整体的架构,里面涉及到本地数据库的存储结构,问了一下表的结构怎么设计的,由于表项比较多,之后我提出了一个在本地文件存储,然后在数据库中存文件路径的方案,然后问了我如何保证数据一致性的问题,我用了个队列来搞,其实就是个数据库事务的问题(现在想想那时候自己真的是菜)。之后由于我的项目是使用Reactor模型来编程的,所以又问了我关于服务器模型和多路复用的东西,这些能说的就比较多,大概讲了30分钟的epoll、poll、select区别和原理,还有高性能服务器模型(详见之前我的博客)。
4. 算法题,多路归并,比较经典的问题了,但是我是第一次碰到,想了一会想出了nlgn的解法,大概说了一下,然后让我写代码实现一个堆,很遗憾的是那时候我完全忘了堆怎么写,想了很久也没想起来(尴尬),然后就让我写了一个快排,幸好这个还比较熟悉,顺利完成。
总体感觉自己表现一般,堆排序那里没想起来太不应该了,而且对数据库的了解一直是弱项。
实习内推二面(视频面试,大约1小时):
1. 这次面试,只有一道题,一道很简单的算法题,给你一棵树,然后给你一个序列,问这个序列是不是树的某一枝,非常简单,一个dfs加上点处理就可以,唯一比较坑的地方就是给定函数原型,但是我自己犯二没写一个return true,后期一直在debug也没发现,等发现了问题也晚了。
挂在了二面,自己犯傻了,没啥说的,有点可惜。
阿里实习面试挂掉,自己还是太弱了。
秋招提前批的内推,学长说他们组已经有俩实习生了,那边可能不好进,我就找了在盘古团队的学姐帮忙内推,然后之前学习了一下mapreduce,gfs和bigtable的三篇论文,算是对分布式存储有了一定的了解。
秋招内推一面(电话面试,大约1小时10分钟):
1. 自我介绍
2. 你对分布式存储有了解吗,我说了一下自己学习过三篇论文,然后问我了解paxos算法不,一面的时候还没看完bigtable,所以不太了解,就说自己不太会,然后问了我hdfs如果节点出故障了怎么办,我回答了master故障和chunk故障时的几种措施,顺便把整个hdfs的工作流程和数据一致性的问题也讲了一遍,大概耗费了20多分钟。
3. 我看你简历上写在头条实习做了jpeg图片方面的一些东西,能大概说一下吗,接着就粗略讲了一下jpeg算法的步骤和原理,又花了20分钟。
4. 第一道算法题,多路归并(怎么阿里云这么喜欢问多路归并),问题不大,归并思路,维护一个堆就行,复杂度nlgn,开始时候写了个nlgnlgn,后来优化了一下。
5. 第二个算法题,不需要敲代码,只说思路,求二叉树的直径,经典问题,两次dfs,又问我了证明,大二时候证明过,但是忘了,想了两分钟没想起来怎么做的,面试官就说那就不用了,面试结束之后想起来咋证明的了,尴尬。
6. 你有没有什么问题问我的?我询问了一下这个组是做一些什么的,说是分布式存储的块存储,然后又问了一下有没有对我以后的学习的建议,他说没什么建议。
一面自己评价还不错,问的问题都准备过或者接触过,也比较熟悉,所有问题都有话可说。
秋招内推二面(视频面试,大约2小时30分钟)
1. 自我介绍
2. 开始和我聊在头条的工作,和jpeg算法有关的东西,这一部分简直是刷新了我对面试的认知,对每一个细节都死抠到底,比如我提到我的cuda的jpeg缩略程序效率是go自带库的10倍,就问了我这个效率是怎么定义的,考虑到go的库用到了cpu的几个核心了吗,再比如我说官方说NPP库的效率优化50倍以上,而我的只优化了10倍,为什么会有这种差距,可能有什么原因,再比如jpeg格式可以这样处理,那其他格式的图片如何处理,如何优化,如果用你说的双线性插值算法,对其他格式而言需要解决什么问题,整个这个阶段就在一直问我和图片有关的每一个细节问题,不过幸好的是我对于图片的调研和了解还比较全面和细致,基本上所有他问到的点都有过研究,所以都答的还不错,最后问了一下我对于整个实习阶段有什么收获,我的回答是这次实习让我觉得自己更有自信能胜任一个从没有接触过的领域,第一次接触图片领域,通过自学和研究能完成任务,让我觉得无论以后在哪个方向上工作,都能很快速地入门,其次收获就是拓宽了自己的知识面。这个阶段一共用了1小时20分钟。
3. 一些基础问题,了解STL源码的内部实现吗,说几个,deque和list的内部实现是怎么样实现的?deque我只用过,没看过源码,这个没答上。然后问了C++面向对象的问题,我说了自己对面向对象了解不多,然后简单讲了一下面向对象的封装、继承和多态。最后问了下TCP的慢启动,比较简单,把慢启动、拥塞避免、快速恢复和快速重传都说了一遍。
4. 一道算法题,如何不用递归写归并排序(咋又是归并啊),开始我给的答案是用栈来模拟递归,向栈里压入区间,然后利用递归的思想去做,这种做法是可以的,但是他不让我用栈,然后我想的是把无序队列分解成若干个有序队列进行多路归并,但是对于类似于5,4,3,2,1这种倒序数组这个算法的复杂度就会退化到n2。最后我想出了办法,用一个变量记录跨度,初始化为1,每归并一次都*2,一直到这个跨度大于了数组长度,每一趟都能保证一个跨度内的数组是有序的,这样相当于一个二叉树的合并的过程,需要注意点的地方就是边界的问题,整体代码不难写,就是细节的地方很多,我俩一起debug了一会,把边界问题处理好了。期间又个小问题就是我习惯开数组的时候开max值+10,被小小批评了一下,说你们搞竞赛的有些习惯不太好。
5. 闲聊时间,他给我讲了一些关于分布式存储的东西,比如什么样的需求需要设计什么样的分布式系统等等,最后我按照自己的惯例问了他根据我的面试对我有什么建议,回答是,基础知识比较扎实,自学能力和沟通能力都比较强,就是建议有两点,第一,无论以后读研还是工作,都最好深入一个领域去研究,第二就是改掉一些不良的编程习惯。
本次面试堪称膀胱面试,说了150分钟,简直口干舌燥,不过自我感觉挺不错的,这个面试官也算是我之前的所有面试中问问题最有水平最细致的面试官了,对他印象挺不错的。
秋招内推三面(电话面试,大约40分钟):
1. 蓝桥杯是什么东西?(这个问题有点尴尬哈)
2. 能说一下你在你们队伍的三个人中是主要负责什么的吗,你们比赛的时候怎么配合的?此处吹了一波尚神,不过由于尚神还在盘古实习,就没提他的名字,只说了某队友。
3. 算法题,正则表达式的匹配,经典dp问题,开始给了一个指数级的搜索算法,后来说了dp,但是我的dp功力还是不太行,有几个细节问题没说好。
4. topk问题,给你一个文件,里面每一行都有一个在一定范围内的自然数,文件很大,比内存要大,如何求前百分之一的数字的最小值,也就是第百分之一大的值。开始给了多路归并的想法,分割文件后每个文件取前百分之一,然后reduce,但是这个有瑕疵,就是可以构造不符合的数据,然后我提出了再随机化一下。接下来的想法是把文件切分之后分别读取,并且维护一个大小为0.01*n大小的堆进行处理,然后问题是如果0.01*n也比内存大怎么办,最后他提醒了我一下,前面有个条件,数字有范围,恍然大悟,直接桶排序就好了。简直无地自容啊,经验主义害死人,一直考虑topk了。接下来问题是如果数字没有范围,然后文件大小比内存小,怎么做,标准topk问题,两个方案,第一个用堆,第二个类似于快排的那种。
5. 操作系统中不同的进程为什么不能互相访问地址,而线程可以,因为是虚拟地址,进程内得到的地址并不是真正的物理地址,而线程有独立的栈空间但共享堆空间。
6. 共享内存是如何实现的?这个答的不好,我答了shmat族的几个函数的我的自己的理解,也不知道对不对。
7. 说一下I/O多路复用是如何实现能同时监听多个文件描述符的,这个就又把select、poll和epoll的原理和对比讲了一遍。
三面自我感觉是凉了,几个点没答好:dp的细节没考虑好,topk犯了经验主义错误,忽略了一个条件,感觉自己已经和阿里云say goodbye了。
秋招内推四面(视频面试,大约1小时):
1. 聊了聊工作的东西,对于jpeg的一些东西,这个不说了,基本他问的二面都问过了。
2. 对于你工作里用的gpu,你是怎么理解的,你觉得还能完成什么任务,我说了一些gpu的基本构成和优点,然后说了在机器学习上可能会用到,然后他让我说了一下我对机器学习的了解,就大概说了一些比较浅显的东西。
3. C++虚函数的一些东西,我这个面向对象是真的不太行,就说了点多态的东西就没啥说的了。
4. TCP和UDP的区别,然后举个实际的例子说一下应用场景,先说了区别,比较简单,应用的话TCP在传输文件的时候可以,UDP在视频、音频通话的时候应用比较多。
5. 算法题,对于一个二维链表,每个节点有两个指针:next和child,如何能把它展开成一个一维链表,顺序随意,让child都是null,所有节点利用next连接。其实二维链表说白了就是个二叉树,next就是lchild,child就是rchild,我们的目的是把二叉树变成一个单链,所有rchild都是null。开始给的是直接dfs得出dfs顺序,然后直接创建一个链表,但是不能额外开空间,想了一会之后想到了,在dfs的过程中判断一下每个节点的左右孩子是否为空,分情况处理,用一个额外指针维护当前的最尾部的那个节点就可以了,具体代码如下:
//评测题目: 二维链表 struct Node { int val; Node *next; Node *child; }; Node *last = null; void dfs(Node *head, Node *father) { if(head -> next == null && head -> child == null) { if(father -> child != null) { head -> next = father -> child; father -> child = null; dfs(head -> next, head); } else { last = head; return; } } else if(head -> next == null && head -> child != null) { head -> next = head -> child; head -> child = null; dfs(head -> next, head); } else if(head -> next != null && head -> child == null) { dfs(head -> next, head); } else { dfs(head -> next, head); last -> next = head -> child; head -> child = null; dfs(last -> next, last); } }
本来以为三面就凉凉了,结果还是来了四面,挺惊喜的,整个过程也算比较顺利。
以上是关于面试经历之阿里云的主要内容,如果未能解决你的问题,请参考以下文章
打怪升级九九八十一难之Java阿里面试一面面试经历,删前速看!