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有如下限制:
因此為了總渲染時間開銷最優,我們一般不直接對每個標記的臟矩形都執行一次局部渲染,而是先對重疊或者相近的臟矩形進行合并,從而減少局部渲染次數。
經過測試,在某臺設備上,單次局部渲染時間開銷與渲染像素數量(既渲染面積)的關系為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,一個招聘軟件,一個藍牙聊天軟件,一個可以寫自定義腳本的軟件。
面試官對游戲比較感興趣,問了游戲框架的實現,和通過我的框架都可以做什么游戲。
然后,又問了藍牙軟件的實現,問的比較多。我當時太緊張了,只講了BluetoothAdapter和BluetoothSocket,著重講了通過流來通信,忘記講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強。后來我查這個算法好像是約瑟夫環。
還有,和面試官說過的每一句話都要小心,不要給自己挖坑!!!!!
全文總結
首先,兩個面試官人都很好。
然后,不要給自己挖坑。
然后,多刷題啊!!!!!!!
希望我寫的經歷對未來要面試的人有幫助。
總結
以上是生活随笔為你收集整理的2019阿里巴巴Android实习生面经的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是代码?
- 下一篇: 计算机科学导论任务书,计算机科学导论论文