背景
本人基本情況:本碩普通985學渣,現居深圳,Android研發,目前主語言Java,某小公司工作中。去年面試字節跳動,死在了最後一類問題上,補發面經,希望能對大家有所幫助。
由於面試時間已經較為久遠,本文就不按照輪次劃分了,按照我自己梳理的順序劃分。
有的內容記不清楚了,可能有遺漏;有的內容可能沒有問到,但我覺得需要複習,也寫出來供大家參考。
所以實際上不算是面經了,算是個經驗分享。
面試注意項
個人認為,下面幾點是很基本的要求,不算加分項,但做不到絕對是扣分項。
- 守時:別遲到,最好提前十到五分鐘進入面試房間(視頻面),攝像頭耳麥等提前一天調試好;
- 耐心:如果面試官有事推遲,保持耐心,不要焦躁;
- 禮貌:基本素養;
- 誠實:簡歷要誠實,問答要誠實,不會的問題不要強答;
- 保持微笑:即使身處險境,也要保持微笑;
- 保持謙卑:切勿狂妄。
主要分享下個人一面情況,
由於每個人的情況不同,本人很菜,懂得有限,輕噴輕噴、、、
1.請編程實現單例模式,懶漢和飽漢寫法
2.請編程實現Java的生產者-消費者模型
3.HashMap的內部結構? 內部原理?
4.請簡述Android事件傳遞機制, ACTION_CANCEL事件何時觸發?
5.Android的進程間通信,Liunx操作系統的進程間通信。
6.JVM虛擬機內存結構,以及它們的作用。這個問題也比較基礎,JVM的內存結構如下圖所示。
7.簡述Android的View繪製流程,Android的wrap_content是如何計算的。
8.有一個整形數組,包含正數和負數,然後要求把數組內的所有負數移至正數的左邊,且保證相對位置不變,要求時間複雜度為O(n), 空間複雜度為O(1)。例如,{10, -2, 5, 8, -4, 2, -3, 7, 12, -88, -23, 35}變化後是{-2, -4,-3, -88, -23,5, 8 ,10, 2, 7, 12, 35}。
9.數組中存有1-3的三種數字,例如[1,2,3,1,2,2,1,3,3],將其排序為[1,1,1,2,2,2,3,3,3],要求時間複雜度,後續將內容變為一個對象,繼續排序
10.1~100盞燈,都是亮的,第一次將能被1整除的數的燈按下,變暗,第二次將能被2整除的數的等按下,變亮,第三次將能被3整除的數的等按下,變暗…第100次將能被100整除的數的燈按下,問,最後有多少盞燈是亮的
整個面試過程,其他都還好,最後幾道題都沒答好,這也跟我平時刷題訓練太少,就掛在了算法這類題目上。
看到這裡,我想這是許多人的疑問,是啊,為什麼大廠都要考算法和數據結構呢?
實際上之所以有很多問題我們不明白不理解,是因為我們所處的角度的問題,在這裡如果你站在老闆的角度上思考問題一切就簡單了。
升職加薪
老闆開公司的目的是為了什麼?錢啊,數據結構與算法有什麼用呢,能為老闆省錢啊,能為老闆省錢的技術你說重要不重要。同樣一個程序,你的運行起來需要10臺服務器,另一個人的只需要2臺,如果你是老闆的話該為誰升職加薪呢?
數據結構與算法就是這樣一種能為老闆多賺錢(能省錢也就是多賺錢)的技術。
那站在程序員的角度呢?
很多初學者甚至有工作經驗的程序員避免學習數據結構與算法,一方面因為其固有的複雜性;另一方面他們覺得數據結構和算法在實際工作中根本就沒什麼用嘛,我們用一個最簡單的遊戲來開始本篇的討論。
有一個猜數的遊戲,玩家說出一個數字,主持人會告訴玩家這個數字是大了還是小了,看誰猜的次數最少,最好的辦法是什麼呢?很顯然:
假設拋出的數字是100,主持人告訴你猜大了,那麼接下來應該猜50;如果主持人告訴你猜小了,那麼接下來應該是75;如果又猜大了,那麼接下來應該是62,如果又小了,那麼應該是56,Congratulations,恭喜你猜到了,實際上你在用二分查找的策略。
這個簡單的示例應該能讓你意識到現實生活中算法的重要性,如果你僅僅認為數據結構與算法只在面試時才有用那就大錯特錯了。
因此,簡單總結一下數據結構與算法的重要性:
通過面試,找到心儀的offer,進入大廠
使用數據結構與算法高效解決面臨的複雜問題,為老闆省錢從而升職加薪。
進入頂尖大廠
許多人會問為什麼很多大廠面試第一關就是算法而不是編程語言、框架等等。
現實中公司尤其是擁有大規模用戶群的的大廠會面臨很多複雜且有挑戰的問題,這些問題都是由像hash表、樹、圖以及各種算法來解決的,比起其它方面,面試官其實更看中候選者是否能運用數據結構與算法來高效解決給定問題。
來自Google、微軟、Facebook、Amazon等公司的程序員可以獲得更高的薪水,為什麼?在這些公司中編寫代碼僅僅佔據了大概20%-30%的時間,那麼剩下的時間都在幹嘛呢?剩下的時間是在尋找或設計更高效的算法以節省公司的資源(主要是服務器),為什麼這些人主要在做這件事呢?因為這些公司擁有全世界最有的用戶,Facebook、YouTube、Twitter、 Instagram、 GoogleMaps等其用戶都有數十億之多,這背後需要的計算資源可想而知,那麼這些資源可都是用錢堆出來的,你用高效的算法為公司節省哪怕0.1%的計算資源,換算成錢的話可能都有數億美金了,這就是算法的重要之處。
假設你在Facebook工作並且想出來一個很牛的算法,使得計算速度由O(N2)提升到了O(NLogN),假設這裡的問題規模N為一億(考慮到Facebook的用戶規模這已經很保守了),那麼O(NLogN)大概為8億,而O(N2)是100000000億,那麼你的算法從效率上提升了大概一千萬倍,想一想這種效率上的提升能為公司節約多少成本。
現在你應該知道為什麼世界上頂尖公司都喜歡僱傭那些聰明傢伙了吧,就是因為他們在代碼效率的一點提升就能為公司節約極大的成本。
我們的現實世界充滿了各種富有挑戰的問題,有些問題甚至依然沒有高效的解法,深度理解這些問題,哪怕你的解法能提升一點點效率,有了這樣的能力想進大廠我想不會有哪個老闆會傻到拒絕你吧。
Data structure and algorithms help in understanding the nature of the problem at a deeper level and thereby a better understanding of the world.
視頻解析數據結構與算法
為了幫助大家更好的掌握數據結構與算法,博主會持續更新LeetCode題解,算法類的文章先比其它會略顯枯燥,為了幫助大家更好的理解博主會盡可能詳細進行講解,當然,一語勝千文,對於算法來說更是如此,音視頻圖像對於我們來說天生更加容易理解,因此這一系列視頻的目的就在於用圖形化的方法來一步一步詳細講解LeetCode,每一份視頻都會講解最終算法是如何設計出來的、以及算法是如何運行的,希望這個項目能幫助讓大家徹底理解並掌握算法。
需要的朋友,可以點擊關注+轉發+私信**學習**前往免費領取!
記住關注+轉發+私信*學習*!關注+轉發+私信*學習*!
重要的事情說三遍!
希望我能夠用我的力量幫助更多迷茫、困惑的朋友們,幫助大家在IT道路上學習和發展~
閱讀更多 Android架構解析 的文章