2019阿里巴巴Android实习生面经
2019阿里巴巴Android實(shí)習(xí)生面經(jīng)
之前看了很多大佬的面經(jīng),我也來分享一下我的經(jīng)歷吧
在線筆試
首先,在官網(wǎng)投遞之后,待投遞結(jié)束,有一個(gè)在線筆試,考的基本和你的面試崗位沒什么關(guān)系,一共10個(gè)選擇,每個(gè)選擇6個(gè)選項(xiàng),兩個(gè)編程題,選擇題什么類型的都有,數(shù)學(xué),網(wǎng)絡(luò),數(shù)據(jù)結(jié)構(gòu)。。。必須要參加,不參加的話簡(jiǎn)歷不會(huì)被發(fā)放。
我選擇一個(gè)都不會(huì)。。。對(duì),一個(gè)都不會(huì),但是全蒙上了,大題只寫了public static void main(String[] args){},嗯,就是這么慘。
下面是在線筆試的編程原題:
第一題
優(yōu)酷目前提供了很多用戶喜歡的功能,可是所有的功能不可能都放在一個(gè)列表中展示,所以用戶在訪問某個(gè)功能的時(shí)候可能存在一個(gè)訪問鏈?,F(xiàn)在產(chǎn)品同學(xué)想要優(yōu)化這個(gè)訪問過程,在優(yōu)化的過程中遵循下面的規(guī)則:
用戶在每個(gè)頁面都會(huì)有停留時(shí)長(zhǎng)(分鐘),如果保留了其中的一個(gè)頁面,那么后續(xù)保留的頁面停留時(shí)長(zhǎng)不能比這個(gè)頁面的停留時(shí)長(zhǎng)短(最后抵達(dá)頁面除外),根據(jù)以往數(shù)據(jù)分析,每去掉的一個(gè)頁面,用戶后續(xù)第一個(gè)頁面停留時(shí)長(zhǎng)會(huì)增加20%,同時(shí)由于用戶對(duì)新功能不熟悉,每?jī)?yōu)化一個(gè)頁面會(huì)造成用戶流失5%,當(dāng)優(yōu)化造成用戶流失超過30%,則該優(yōu)化不可取,請(qǐng)問如何優(yōu)化這個(gè)鏈路,從而保證用戶在使用的過程中停留時(shí)間最長(zhǎng)而用戶流失最少?
輸入:
第一行輸入正整數(shù)P(訪問頁面數(shù))(2<P<=10)
第二行輸入P個(gè)正整數(shù)P1,P2,P3----Pn(0<Pn)
輸出:
最長(zhǎng)停留時(shí)間(保留2位小數(shù))
原停留時(shí)長(zhǎng)
優(yōu)化后的每個(gè)頁面停留時(shí)長(zhǎng)(保留2位小數(shù))
最后保留的用戶量(保留2位小數(shù))
輸入范例:
5
10 5 8 12 4
輸出范例:
30.00
5 8 12 4
6.00 8.00 12.00 4.00
0.95
第二題
臟矩形合并
在2D渲染系統(tǒng)中,局部渲染是常見提升渲染性能的方法。如果界面中有元素發(fā)生了改變,我們可以將這個(gè)元素所占矩形區(qū)域標(biāo)記為臟矩形,那么在接下來的渲染中,我們僅對(duì)每個(gè)臟矩形所占矩形區(qū)域執(zhí)行一次局部渲染即可,無需渲染全屏。
但系統(tǒng)提供的局部渲染API有如下限制:
因此為了總渲染時(shí)間開銷最優(yōu),我們一般不直接對(duì)每個(gè)標(biāo)記的臟矩形都執(zhí)行一次局部渲染,而是先對(duì)重疊或者相近的臟矩形進(jìn)行合并,從而減少局部渲染次數(shù)。
經(jīng)過測(cè)試,在某臺(tái)設(shè)備上,單次局部渲染時(shí)間開銷與渲染像素?cái)?shù)量(既渲染面積)的關(guān)系為f(x)=10000+x。
現(xiàn)在要求你設(shè)計(jì)一個(gè)算法,算法輸入一組臟矩形列表,輸出經(jīng)過合并后的臟矩形列表的總渲染時(shí)間開銷,要求合并后的臟矩形列表總渲染時(shí)間開銷在這臺(tái)設(shè)備上最優(yōu)。
如圖所示紅色矩形為合并后的臟矩形。
輸入:
輸入數(shù)據(jù)包含多行
第1行,整數(shù)N(臟矩形數(shù)量,1<=N<=8)
第2行,整數(shù)L1(第一個(gè)臟矩形左上角橫坐標(biāo))
第3行,整數(shù)T1(第一個(gè)臟矩形左上角縱坐標(biāo))
第4行,整數(shù)W1(第一個(gè)臟矩形寬, 1<=W1)
第5行,整數(shù)H1(第一個(gè)臟矩形高, 1<=H1)
…
第4*(N-1)+2行,整數(shù)LN(第N個(gè)臟矩形左上角橫坐標(biāo))
第4*(N-1)+3行,整數(shù)TN(第N個(gè)臟矩形左上角縱坐標(biāo))
第4*(N-1)+4行,整數(shù)WN(第N個(gè)臟矩形寬, 1<=WN)
第4*(N-1)+5行,整數(shù)HN(第N個(gè)臟矩形高, 1<=HN)
輸出:
輸出合并后的臟矩形列表總渲染時(shí)間開銷
輸入范例:
5
232
66
111
41
197
44
29
53
154
208
42
12
177
87
9
102
75
168
79
41
輸出范例:
45291
我當(dāng)時(shí)連題都讀不懂,現(xiàn)在依然讀不懂,然后不到20分鐘,我就交卷了。當(dāng)時(shí)就感覺涼了,然后也沒有看官網(wǎng)的簡(jiǎn)歷投遞狀態(tài)。
一面
沒想到,大概一周之后。網(wǎng)上八點(diǎn)多,手機(jī)來了一個(gè)電話,顯示浙江杭州,當(dāng)時(shí)心里一驚,然后就接起來了。果然對(duì)面是阿里巴巴的,說是某WX事業(yè)部的,能不能進(jìn)行一個(gè)簡(jiǎn)單的面試。然后就進(jìn)行了面試。
1.首先是自我介紹,嗯,當(dāng)時(shí)太緊張了,面試官告訴我說慢點(diǎn)。
2.然后是項(xiàng)目介紹,我介紹的是自己手寫的游戲框架實(shí)現(xiàn)的五子棋和2048,一個(gè)招聘軟件,一個(gè)藍(lán)牙聊天軟件,一個(gè)可以寫自定義腳本的軟件。
面試官對(duì)游戲比較感興趣,問了游戲框架的實(shí)現(xiàn),和通過我的框架都可以做什么游戲。
然后,又問了藍(lán)牙軟件的實(shí)現(xiàn),問的比較多。我當(dāng)時(shí)太緊張了,只講了BluetoothAdapter和BluetoothSocket,著重講了通過流來通信,忘記講UUID了。
3.接著,面試官問我用沒用過Android Studio看過軟件運(yùn)行時(shí)所占內(nèi)存,我說沒有,但是我用手機(jī)看過(其實(shí)沒看過),然后面試官就問我內(nèi)存占了多少,我(編的)說大概40多M(后來我看了是70M)。
4.后來又問我知不知道一個(gè)進(jìn)程給分配多少的空間,我直接說不知道,確實(shí)不知道,也沒法編。
4.在講項(xiàng)目中間,我說我內(nèi)個(gè)框架是照著外國(guó)的一個(gè)作者寫的一本書里的Java框架改到Android的,然后面試官就問了我平時(shí)看過什么和Android相關(guān)的書,我說了好多,然后還談到了CSDN博客,面試官又問了平時(shí)都看那些博主的博客,我又說了很多,然后面試官又問了Android的學(xué)習(xí)過程,我借機(jī)把話題引到了跨進(jìn)程通信。
5.然后面試官讓我講講binder,然后我從傳統(tǒng)的Linux通信方式和binder做了比較,說了binder的優(yōu)點(diǎn),實(shí)現(xiàn)了mmap()函數(shù),還有binder的四部分:binder驅(qū)動(dòng),client,server,serviceManager。binder的注冊(cè)和請(qǐng)求過程。
6.面試官又問了Android中跨進(jìn)程通信的方式。我又回答了很多。面試官很滿意。
7.接下來,又問了ClassLoader,我直接帶著雙親委派模型,BootstrapClassLoader ,AppClassLoader,ExtClassLoader相關(guān)的全說了,還說了內(nèi)部加載代碼的邏輯,后面還說了命名空間,初始類加載器,定義類加載器,線程上下文加載器等等。
8.后來又讓我談?wù)?strong>Java的反射,我其實(shí)只用過一點(diǎn),說了個(gè)大概,然后舉了注解中用到的反射,和注解的實(shí)現(xiàn)。
9,接著問了Activity的啟動(dòng)方式,這個(gè)太簡(jiǎn)單了。
10,最后,面試官說問我最后一個(gè),問我一個(gè)集合類的。我當(dāng)時(shí)很激動(dòng),想著背的HashMap,ConcurrentHashMap,Hashtable,HashSet。終于可以裝B了。
然后。。。。。。。。。。。。。。。
面試官問的ArrayList和LinkedList的區(qū)別,然后我就回答了一個(gè)用在添加刪除多的時(shí)候,一個(gè)用在查找多的時(shí)候。
然后就結(jié)束了。差一分鐘九點(diǎn),大概面了40多分鐘,當(dāng)時(shí)面完感覺涼了,太緊張了,說得很快,很多想說的都忘了。
一面總結(jié)
一面給我的感覺是粗略的問問項(xiàng)目,著重考察Java基礎(chǔ)和java高級(jí)的一些知識(shí),還有Android的一些知識(shí)。還有就是面試沒有任何通知,直接突然來電話,你也不知道什么時(shí)候會(huì)來。
**重點(diǎn):**前一天馬云爸爸剛說完阿里不強(qiáng)制996,然后。。真香。[滑稽]
二面
接著,過了三天,正當(dāng)我都以為自己要涼了的時(shí)候,晚上七點(diǎn)多,和上次一樣,突擊面試。然后進(jìn)入正題。
1.面試官問項(xiàng)目中五子棋實(shí)現(xiàn)的思路和勝負(fù)檢測(cè),我說了大概一半,面試官就問下一個(gè)問題,這回的面試官感覺明顯不像第一回的面試官。第一回的面試官會(huì)讓你不停的說,直到你說不出來,他再問問題,這回的面試官會(huì)讓你點(diǎn)到為止,除非他問了特別底層的東西,否則就不會(huì)讓你展示。
2.然后順著項(xiàng)目問自定義View的原理,當(dāng)時(shí)比較緊張把Measure和Layout過程講反了,然后講了ViewRootImpl的performTraversal。
3.然后又問了項(xiàng)目中的招聘軟件,為什么要用rxjava+retrofit,然后我回答了是為了異步之類的。講了講retrofit的大概原理(實(shí)際我背源碼了),沒敢講太多。說了retrofit和REST的配合。
4.然后面試官問說一些rxjava中常用的方法,前幾天剛看完Android進(jìn)階之光,但是就是就是記不起來了,然后說了變換,定時(shí)發(fā)送,線程切換。
5.然后面試官問rxjava線程切換的原理,哈哈,我背過,雖然忘了點(diǎn),但是大概還是說出來了。
6.后來面試官又問我學(xué)的專業(yè)開過什么和軟件相關(guān)的課,可能是因?yàn)槲也皇擒浖?jì)算機(jī)專業(yè)的。然后我回答了一門計(jì)算機(jī)軟件基礎(chǔ),里面講一些簡(jiǎn)單的算法和數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng),二分查找,快速排序什么的(這里埋下伏筆)。
7.然后,面試官又問我操作系統(tǒng)中線程和進(jìn)程的區(qū)別,我說了幾句,舉了個(gè)房子和里面的屋子的例子。
8,面試官問操作系統(tǒng)一個(gè)進(jìn)程給分配多少的空間,我心想,這之前不是問過嗎,涼了涼了,然后面試官可能看我說不來,又補(bǔ)充了假設(shè)是4G的怎么分配,我突然想到了之前的Linux相關(guān)的,就回答了Linux下用戶空間3G,內(nèi)核空間1G。
8.我說完又問了Handler的實(shí)現(xiàn)機(jī)制,哈哈,這個(gè)我也背過。然后就講了Looper,MessageQueue,Handler,ThreadLocal。
9.后來,面試官結(jié)合handler問了一個(gè)實(shí)際的問題,handler通過postDelay(5s)發(fā)送log打印A,然后handler通過sendMessage發(fā)送log打印B,線程停止5s,handle通過post
Delay(6s)發(fā)送log打印C,問打印的順序,當(dāng)時(shí)聽的一臉懵逼,還不好意思說不會(huì),然后,我就說可能什么順序都可能,由于指令重排序(我在瞎扯),面試官說是在一個(gè)線程。。。然后我就說不知道。。。。,面試官說結(jié)合你剛才說的原理。然后我就說了一個(gè)我認(rèn)為對(duì)的順序。
可能是由于這個(gè)問題吧,給面試官一種理論豐富,實(shí)踐不足的感覺,或者是他之前就安排好的,面試官說第二題晚上七點(diǎn)給我安排一個(gè)在線筆試,然后我就被安排了。。。。
二面總結(jié)
二面問的基本就是純項(xiàng)目了,所以,不要給自己挖坑。。。。簡(jiǎn)歷好好寫,背框架源碼,還有一點(diǎn),之前面試中不會(huì)的問題面試之后要學(xué)習(xí),可能面試官會(huì)通過這個(gè)來判斷面試者的學(xué)習(xí)態(tài)度和功利心。
二面的在線筆試
好吧,我也不知道到底該叫二面還是三面,謙虛一點(diǎn),還是叫二面。我就是死在這了。接下倆說說我是怎么死的。我復(fù)習(xí)的東西就不說了,直接說題。一共兩道。
第一題 二分查找
第二題 一隊(duì)人報(bào)數(shù)123 123 123 。。。報(bào)到3的人離隊(duì),剩下的人繼續(xù)報(bào)數(shù),問最后一個(gè)人是原來隊(duì)伍里的幾號(hào)
第一題,這就是我之前說的伏筆,我說了二分查找,他就考了二分查找,我復(fù)習(xí)的快速排序。MMP。然后用的是阿里巴巴伯樂平臺(tái),你在線輸入什么,面試官那里同步就能看見。然后我就慌了。最后按思路寫出來了,但是放在eclipse運(yùn)行,死循環(huán)。。。。。
然后也沒改,期間,我寫的好好的,突然網(wǎng)頁就關(guān)了,我再進(jìn)就進(jìn)不去了,我當(dāng)時(shí)還心想是不是面試官看我太菜了,直接給我結(jié)束了。沒幾分鐘,面試官給我打電話,問我怎么退出來了,我才意識(shí)到是我不小心點(diǎn)鼠標(biāo)版給關(guān)了。。。尷尬。。。后來面試官又給開了一個(gè)連接,原本兩個(gè)題50min,后來又給我加了5min。
第二題,面試官之前出完提問我題能不能看懂,我說能,實(shí)際上他沒給我輸入輸出。我當(dāng)時(shí)真是太緊張了,后來才發(fā)現(xiàn)的,當(dāng)時(shí)問一句好了。
我的思路是建了一個(gè)類,保存每個(gè)人的名字和編號(hào),把人都加到ArrayList里的(其實(shí)應(yīng)該用LinkedList,失誤啊),這樣每個(gè)人自身就保存了編號(hào),然后用一個(gè)計(jì)數(shù)器記錄報(bào)數(shù)的順序123123,從List中remove,這個(gè)題最難的地方是每一輪不一定報(bào)道三結(jié)束,可能是到2或者1,那么就下來就得接著報(bào)數(shù)。
后來寫完了,面試官給我打電話,讓我解釋以下第二個(gè)代碼,實(shí)際我第二個(gè)代碼寫了注釋,然后我解釋完,面試官問我,有沒有別的想法,我當(dāng)時(shí)就知道涼了。當(dāng)時(shí)也不能說沒有,然后就說有很多但是就這個(gè)最好寫。然后就結(jié)束了。
筆試總結(jié)
現(xiàn)在想想感覺我寫的很可笑,對(duì)于阿里來說,高用戶并發(fā)量,用bean十分消耗內(nèi)存,100個(gè)人排隊(duì)可以,倘若1000000個(gè)人呢,可能就不行了,哪怕用數(shù)組都比bean強(qiáng)。后來我查這個(gè)算法好像是約瑟夫環(huán)。
還有,和面試官說過的每一句話都要小心,不要給自己挖坑!!!!!
全文總結(jié)
首先,兩個(gè)面試官人都很好。
然后,不要給自己挖坑。
然后,多刷題啊!!!!!!!
希望我寫的經(jīng)歷對(duì)未來要面試的人有幫助。
總結(jié)
以上是生活随笔為你收集整理的2019阿里巴巴Android实习生面经的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是代码?
- 下一篇: Android developer 阅读