2019阿里巴巴Android实习生面经

2019阿里巴巴Android实习生面经

之前看了很多大佬的面经,我也来分享一下我的经历吧

在线笔试

首先,在官网投递之后,待投递结束,有一个在线笔试,考的基本和你的面试岗位没什么关系,一共10个选择,每个选择6个选项,两个编程题,选择题什么类型的都有,数学,网络,数据结构。。。必须要参加,不参加的话简历不会被发放。
我选择一个都不会。。。对,一个都不会,但是全蒙上了,大题只写了public static void main(String[] args){},嗯,就是这么惨。
下面是在线笔试的编程原题:

第一题
优酷目前提供了很多用户喜欢的功能,可是所有的功能不可能都放在一个列表中展示,所以用户在访问某个功能的时候可能存在一个访问链。现在产品同学想要优化这个访问过程,在优化的过程中遵循下面的规则:
用户在每个页面都会有停留时长(分钟),如果保留了其中的一个页面,那么后续保留的页面停留时长不能比这个页面的停留时长短(最后抵达页面除外),根据以往数据分析,每去掉的一个页面,用户后续第一个页面停留时长会增加20%,同时由于用户对新功能不熟悉,每优化一个页面会造成用户流失5%,当优化造成用户流失超过30%,则该优化不可取,请问如何优化这个链路,从而保证用户在使用的过程中停留时间最长而用户流失最少?

输入:
第一行输入正整数P(访问页面数)(2<P<=10)
第二行输入P个正整数P1,P2,P3----Pn(0<Pn)
输出:
最长停留时间(保留2位小数)
原停留时长
优化后的每个页面停留时长(保留2位小数)
最后保留的用户量(保留2位小数)
输入范例:
5
10 5 8 12 4
输出范例:
30.00
5 8 12 4
6.00 8.00 12.00 4.00
0.95

第二题
脏矩形合并
在2D渲染系统中,局部渲染是常见提升渲染性能的方法。如果界面中有元素发生了改变,我们可以将这个元素所占矩形区域标记为脏矩形,那么在接下来的渲染中,我们仅对每个脏矩形所占矩形区域执行一次局部渲染即可,无需渲染全屏。
但系统提供的局部渲染API有如下限制:

  1. 单次局部渲染区域必需是矩形,不能是多边形,圆形或者其他不规则形状。
  2. 单次局部渲染时间开销除了和渲染像素数量呈线性正相关之外,还有一些固定的额外开销。
  3. 单个元素不可切分渲染,既最初标记的脏矩形不可切分渲染。
    因此为了总渲染时间开销最优,我们一般不直接对每个标记的脏矩形都执行一次局部渲染,而是先对重叠或者相近的脏矩形进行合并,从而减少局部渲染次数。
    经过测试,在某台设备上,单次局部渲染时间开销与渲染像素数量(既渲染面积)的关系为f(x)=10000+x。
    现在要求你设计一个算法,算法输入一组脏矩形列表,输出经过合并后的脏矩形列表的总渲染时间开销,要求合并后的脏矩形列表总渲染时间开销在这台设备上最优。
    如图所示红色矩形为合并后的脏矩形。
    在这里插入图片描述输入:
    输入数据包含多行
    第1行,整数N(脏矩形数量,1<=N<=8)
    第2行,整数L1(第一个脏矩形左上角横坐标)
    第3行,整数T1(第一个脏矩形左上角纵坐标)
    第4行,整数W1(第一个脏矩形宽, 1<=W1)
    第5行,整数H1(第一个脏矩形高, 1<=H1)

    第4*(N-1)+2行,整数LN(第N个脏矩形左上角横坐标)
    第4*(N-1)+3行,整数TN(第N个脏矩形左上角纵坐标)
    第4*(N-1)+4行,整数WN(第N个脏矩形宽, 1<=WN)
    第4*(N-1)+5行,整数HN(第N个脏矩形高, 1<=HN)
    输出:
    输出合并后的脏矩形列表总渲染时间开销
    输入范例:
    5
    232
    66
    111
    41
    197
    44
    29
    53
    154
    208
    42
    12
    177
    87
    9
    102
    75
    168
    79
    41
    输出范例:
    45291

我当时连题都读不懂,现在依然读不懂,然后不到20分钟,我就交卷了。当时就感觉凉了,然后也没有看官网的简历投递状态。

一面

没想到,大概一周之后。网上八点多,手机来了一个电话,显示浙江杭州,当时心里一惊,然后就接起来了。果然对面是阿里巴巴的,说是某WX事业部的,能不能进行一个简单的面试。然后就进行了面试。

1.首先是自我介绍,嗯,当时太紧张了,面试官告诉我说慢点。
2.然后是项目介绍,我介绍的是自己手写的游戏框架实现的五子棋和2048,一个招聘软件,一个蓝牙聊天软件,一个可以写自定义脚本的软件。
面试官对游戏比较感兴趣,问了游戏框架的实现,和通过我的框架都可以做什么游戏。
然后,又问了蓝牙软件的实现,问的比较多。我当时太紧张了,只讲了BluetoothAdapterBluetoothSocket,着重讲了通过流来通信,忘记讲UUID了。
3.接着,面试官问我用没用过Android Studio看过软件运行时所占内存,我说没有,但是我用手机看过(其实没看过),然后面试官就问我内存占了多少,我(编的)说大概40多M(后来我看了是70M)。
4.后来又问我知不知道一个进程给分配多少的空间,我直接说不知道,确实不知道,也没法编。
4.在讲项目中间,我说我内个框架是照着外国的一个作者写的一本书里的Java框架改到Android的,然后面试官就问了我平时看过什么和Android相关的书,我说了好多,然后还谈到了CSDN博客,面试官又问了平时都看那些博主的博客,我又说了很多,然后面试官又问了Android的学习过程,我借机把话题引到了跨进程通信。
5.然后面试官让我讲讲binder,然后我从传统的Linux通信方式和binder做了比较,说了binder的优点,实现了mmap()函数,还有binder的四部分:binder驱动,client,server,serviceManager。binder的注册和请求过程。
6.面试官又问了Android中跨进程通信的方式。我又回答了很多。面试官很满意。
7.接下来,又问了ClassLoader,我直接带着双亲委派模型,BootstrapClassLoader ,AppClassLoader,ExtClassLoader相关的全说了,还说了内部加载代码的逻辑,后面还说了命名空间,初始类加载器,定义类加载器,线程上下文加载器等等。
8.后来又让我谈谈Java的反射,我其实只用过一点,说了个大概,然后举了注解中用到的反射,和注解的实现。
9,接着问了Activity的启动方式,这个太简单了。
10,最后,面试官说问我最后一个,问我一个集合类的。我当时很激动,想着背的HashMap,ConcurrentHashMap,Hashtable,HashSet。终于可以装B了。
然后。。。。。。。。。。。。。。。
面试官问的ArrayList和LinkedList的区别,然后我就回答了一个用在添加删除多的时候,一个用在查找多的时候。

然后就结束了。差一分钟九点,大概面了40多分钟,当时面完感觉凉了,太紧张了,说得很快,很多想说的都忘了。

一面总结

一面给我的感觉是粗略的问问项目,着重考察Java基础和java高级的一些知识,还有Android的一些知识。还有就是面试没有任何通知,直接突然来电话,你也不知道什么时候会来。

**重点:**前一天马云爸爸刚说完阿里不强制996,然后。。真香。[滑稽]

二面

接着,过了三天,正当我都以为自己要凉了的时候,晚上七点多,和上次一样,突击面试。然后进入正题。

1.面试官问项目中五子棋实现的思路和胜负检测,我说了大概一半,面试官就问下一个问题,这回的面试官感觉明显不像第一回的面试官。第一回的面试官会让你不停的说,直到你说不出来,他再问问题,这回的面试官会让你点到为止,除非他问了特别底层的东西,否则就不会让你展示。
2.然后顺着项目问自定义View的原理,当时比较紧张把Measure和Layout过程讲反了,然后讲了ViewRootImpl的performTraversal。
3.然后又问了项目中的招聘软件,为什么要用rxjava+retrofit,然后我回答了是为了异步之类的。讲了讲retrofit的大概原理(实际我背源码了),没敢讲太多。说了retrofit和REST的配合。
4.然后面试官问说一些rxjava中常用的方法,前几天刚看完Android进阶之光,但是就是就是记不起来了,然后说了变换,定时发送,线程切换。
5.然后面试官问rxjava线程切换的原理,哈哈,我背过,虽然忘了点,但是大概还是说出来了。
6.后来面试官又问我学的专业开过什么和软件相关的课,可能是因为我不是软件计算机专业的。然后我回答了一门计算机软件基础,里面讲一些简单的算法和数据结构,操作系统,二分查找,快速排序什么的(这里埋下伏笔)。
7.然后,面试官又问我操作系统中线程和进程的区别,我说了几句,举了个房子和里面的屋子的例子。
8,面试官问操作系统一个进程给分配多少的空间,我心想,这之前不是问过吗,凉了凉了,然后面试官可能看我说不来,又补充了假设是4G的怎么分配,我突然想到了之前的Linux相关的,就回答了Linux下用户空间3G,内核空间1G。
8.我说完又问了Handler的实现机制,哈哈,这个我也背过。然后就讲了Looper,MessageQueue,Handler,ThreadLocal。
9.后来,面试官结合handler问了一个实际的问题,handler通过postDelay(5s)发送log打印A,然后handler通过sendMessage发送log打印B,线程停止5s,handle通过post
Delay(6s)发送log打印C,问打印的顺序
,当时听的一脸懵逼,还不好意思说不会,然后,我就说可能什么顺序都可能,由于指令重排序(我在瞎扯),面试官说是在一个线程。。。然后我就说不知道。。。。,面试官说结合你刚才说的原理。然后我就说了一个我认为对的顺序。
可能是由于这个问题吧,给面试官一种理论丰富,实践不足的感觉,或者是他之前就安排好的,面试官说第二题晚上七点给我安排一个在线笔试,然后我就被安排了。。。。

二面总结

二面问的基本就是纯项目了,所以,不要给自己挖坑。。。。简历好好写,背框架源码,还有一点,之前面试中不会的问题面试之后要学习,可能面试官会通过这个来判断面试者的学习态度和功利心。

二面的在线笔试

好吧,我也不知道到底该叫二面还是三面,谦虚一点,还是叫二面。我就是死在这了。接下俩说说我是怎么死的。我复习的东西就不说了,直接说题。一共两道。

第一题 二分查找
第二题 一队人报数123 123 123 。。。报到3的人离队,剩下的人继续报数,问最后一个人是原来队伍里的几号

第一题,这就是我之前说的伏笔,我说了二分查找,他就考了二分查找,我复习的快速排序。MMP。然后用的是阿里巴巴伯乐平台,你在线输入什么,面试官那里同步就能看见。然后我就慌了。最后按思路写出来了,但是放在eclipse运行,死循环。。。。。
然后也没改,期间,我写的好好的,突然网页就关了,我再进就进不去了,我当时还心想是不是面试官看我太菜了,直接给我结束了。没几分钟,面试官给我打电话,问我怎么退出来了,我才意识到是我不小心点鼠标版给关了。。。尴尬。。。后来面试官又给开了一个连接,原本两个题50min,后来又给我加了5min。

第二题,面试官之前出完提问我题能不能看懂,我说能,实际上他没给我输入输出。我当时真是太紧张了,后来才发现的,当时问一句好了。
我的思路是建了一个类,保存每个人的名字和编号,把人都加到ArrayList里的(其实应该用LinkedList,失误啊),这样每个人自身就保存了编号,然后用一个计数器记录报数的顺序123123,从List中remove,这个题最难的地方是每一轮不一定报道三结束,可能是到2或者1,那么就下来就得接着报数。
后来写完了,面试官给我打电话,让我解释以下第二个代码,实际我第二个代码写了注释,然后我解释完,面试官问我,有没有别的想法,我当时就知道凉了。当时也不能说没有,然后就说有很多但是就这个最好写。然后就结束了。

笔试总结

现在想想感觉我写的很可笑,对于阿里来说,高用户并发量,用bean十分消耗内存,100个人排队可以,倘若1000000个人呢,可能就不行了,哪怕用数组都比bean强。后来我查这个算法好像是约瑟夫环。
还有,和面试官说过的每一句话都要小心,不要给自己挖坑!!!!!

全文总结

首先,两个面试官人都很好。
然后,不要给自己挖坑。
然后,多刷题啊!!!!!!!

希望我写的经历对未来要面试的人有帮助。

发布了10 篇原创文章 · 获赞 5 · 访问量 591

猜你喜欢

转载自blog.csdn.net/LeeDuoZuiShuai/article/details/89441088