前言
這段時(shí)間稍微斷更了一段時(shí)間,因?yàn)槲以跍?zhǔn)備面試。經(jīng)過兩次面試后,有一些比較深刻的認(rèn)識。對于大廠來說,除了對專業(yè)知識考究之外,對算法也尤為看重。
簡單的說一下情況,字節(jié)已經(jīng)拿到offer,騰訊所有的面面試已經(jīng)通過了,也應(yīng)該有offer了。字節(jié)一共4面:3面技術(shù),1面hr;騰訊5次技術(shù)面,1次hr面。其中5面是2個(gè)面試官上陣。
總的來說騰訊的面試確實(shí)強(qiáng)度更高更加持久。字節(jié)是分開一次1個(gè)小時(shí)面試的。而騰訊1、2面是一次一小時(shí),而3面和4面是連續(xù)面試一口氣高強(qiáng)度的面試2小時(shí),5面則是2個(gè)面試官輪流提問。騰訊是持久戰(zhàn)稍微腦子不清醒一點(diǎn)就可能出現(xiàn)大錯(cuò)漏。我在4面就是如此,差點(diǎn)出事了。請準(zhǔn)備好糖分和水分及時(shí)補(bǔ)充,或者洗把臉保持清晰。
正文
面試的過程一般只有1個(gè)小時(shí),如何在一個(gè)小時(shí)內(nèi)徹底的考究你本人的水平究竟到達(dá)那種境界,也是面試官努力的方向。
而面試往往是由兩部分構(gòu)成:
- 1.算法
- 2.專業(yè)知識
關(guān)于算法
為什么把算法擺在第一點(diǎn),因?yàn)樗惴ㄔ谖铱磥磉@是大部分沒有面試過大廠的朋友可能會忽視的一方面。它的重要程度不比專業(yè)知識的考究來的低。
在1-2小時(shí)內(nèi),如何能快速的看到你編碼水平和思維就看這些算法的考究。
因此需要對常見的數(shù)據(jù)結(jié)構(gòu)比較熟悉,如鏈表,樹,棧,堆。需要知道遇到數(shù)組相關(guān)的題型可能需要用到如快慢指針等解題思路。還有廣度深度優(yōu)先算法。最后,如果還有更難一點(diǎn)的,會涉及到回溯,動(dòng)態(tài)規(guī)劃等解題思路。
前面幾點(diǎn)都比較好處理,只要在leetcode上做到一定量的題目,都能反應(yīng)過來。我本人認(rèn)為我并非是聰明的人,做了300快400道題也僅僅只是摸索出了一些大致的套路。我是完全比不了那些做了100+道題就能靈活掌握算法的大神。
但是經(jīng)過了系統(tǒng)性的訓(xùn)練,遇到一些常見的算法解題思路可以快速的反應(yīng)過來。
而動(dòng)態(tài)規(guī)劃相關(guān)的問題,我看來是最難的。關(guān)鍵是需要判斷題目是否可以分解成小問題且小問題之間不能互相影響,接著找到動(dòng)態(tài)規(guī)劃方程,或者是狀態(tài)轉(zhuǎn)移表。
在聽到面試官的算法題后,先不要急著下筆。最好在下筆之前和面試官聊聊你的思路。不同面試官的要求不同,有的面試官,希望算法是原地算法,有的面試官希望時(shí)間復(fù)雜度降低,有的希望空間復(fù)雜度降低。
最好能清晰的表達(dá)你的初步思路后,面試官會知道你的算法的方向是否正確,可以一定程度上給予你方向上的指引。
記住就算你做過原題,除非你的方案能保證是從空間和時(shí)間復(fù)雜度是最優(yōu),不然我還是建議面試者多和面試官交流。在交流的過程中,面試官也能明白你的思考過程,從而判斷你這個(gè)人的編程能力如何。
千萬不要小看這個(gè)模塊的考究,如果說面試專業(yè)知識是100分,那么算法題可以占據(jù)50分。如果你寫不出,或者思路完全偏離了,那就可以說再見了。
在我寫文章學(xué)習(xí)的這5年里面,也有不少的朋友問我的意向,其中不乏有大廠。然而我深知我的算法水平確實(shí)不太行,學(xué)習(xí)的源碼水平還不足,很多時(shí)候都婉拒了。也就今年和去年,練習(xí)算法已有近2個(gè)年頭,才敢出山試試。
就算是這樣的我,算法上的能力評價(jià)還是不高,只能說是達(dá)到了大廠的合格線,還需要繼續(xù)加強(qiáng)。
最后,再給兩點(diǎn)建議:
一個(gè)人光看不練是不行的,一個(gè)人瞎琢磨效率偏低。
最好可以買幾本書或者課程指導(dǎo)。我是看了輝哥的課程,閱讀了極客時(shí)間的劉超的數(shù)據(jù)結(jié)構(gòu),還閱讀了書籍算法4。把基礎(chǔ)都補(bǔ)充好后,可以去leetcode中對每一個(gè)數(shù)據(jù)結(jié)構(gòu)專項(xiàng)進(jìn)行訓(xùn)練。在這些基礎(chǔ)上,在做一做劍指offer中經(jīng)典題目也就差不多了。
關(guān)于專業(yè)知識
網(wǎng)上很多人都在求大廠面試的真題,實(shí)際上我看來意義并不大。因?yàn)槊嬖嚬俨⒉粫嬖嚹銓懺诤啔v之外的隨意一個(gè)問題。一般都是問你簡歷上的工作成果,以及背后延伸出來的知識點(diǎn)。更多的還是需要自己日常的積累。
當(dāng)然也有一些老生常談的基本考點(diǎn),如Handler,多線程等。
因此,背面試題不是最重要。關(guān)鍵是回顧你的簡歷上的工作成果以及簡歷上的知識點(diǎn),并不斷的深挖。
下面是面試情況,以及一些簡答。實(shí)際上在回答的過程中,可以回答的更加詳細(xì),本文只是篩選了部分問題簡單介紹了知識點(diǎn)的要點(diǎn)。
字節(jié)面試
字節(jié)面試一共4面。字節(jié)的面試風(fēng)格偏向基礎(chǔ)的內(nèi)容,以及簡歷上知識點(diǎn)的擴(kuò)展。
字節(jié)1面
1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及原因
2.為什么使用
mmap優(yōu)化io讀寫,mmap和傳統(tǒng)讀寫有什么區(qū)別?為什么選擇它?
簡答大意:mmap本質(zhì)上從內(nèi)核中 進(jìn)程中申請了vm_area_struct虛擬內(nèi)存后,把虛擬內(nèi)存保存到 file結(jié)構(gòu)體address_space結(jié)構(gòu)體中的i_mmap中。當(dāng)需要訪問這段虛擬地址,就會產(chǎn)生卻也中斷,通過伙伴系統(tǒng)申請出物理內(nèi)存綁定。如果是文件映射還會預(yù)讀取文件內(nèi)容,之后讀取可以命中后續(xù)的緩存。項(xiàng)目中也有頻繁進(jìn)行寫入,可以快速的同步到內(nèi)存中。
- 3.Object 中有什么方法?
簡答:equal,wait等。
- 4.Object 的equal實(shí)現(xiàn)?重寫equal需要注意的方面。
簡答: equal 本質(zhì)上是獲取Object的 hashCode。而在hotspot虛擬機(jī)中,計(jì)算方式在類markOop中,hashCode的計(jì)算是獲取對象的高16位向右移動(dòng)16位并且與上掩碼。
equal 重寫時(shí)候,需要按需求處理。一般的,為了讓HashMap等需要hashCode計(jì)算正確,需要把equal中每一個(gè)成員變量。
- 5.
synchronized原理。
簡答:翻譯成字節(jié)碼后,本質(zhì)上在虛擬機(jī)中對應(yīng)兩個(gè)字節(jié)碼 MONITOR_ENTER 以及 MONITOR_EXIT 。通過Monitor進(jìn)行臨界區(qū)保護(hù)。當(dāng)執(zhí)行了MONITOR_ENTER后,本質(zhì)上就會取出Object 中的LockWord 中的記錄鎖狀態(tài)信息。
在Android 虛擬機(jī)中,存在3種鎖。通過記錄thread_id的偏向鎖,瘦鎖,胖鎖。瘦鎖是一種樂觀鎖,本質(zhì)上就是不斷的自旋讓渡cpu資源。當(dāng)64次之后獲取不到,則轉(zhuǎn)化為胖鎖。胖鎖的實(shí)現(xiàn)是基于futex進(jìn)行同步處理的。
- 6.
volatile原理
簡答:解決三個(gè)問題。語序重拍,讀時(shí)未同步,寫時(shí)被修改。實(shí)現(xiàn)原理是基于讀寫欄柵處理cpu讀寫順序,同時(shí)處理編譯時(shí)候嚴(yán)格按照編碼順序處理。本質(zhì)上是通過c++的atomic實(shí)現(xiàn)的。
- 7.ui優(yōu)化
簡答:優(yōu)化ui層級,activityidleHandler 處理不重要事件,提前實(shí)例化ui到緩存池子,x2c等,展開說。
- 8.內(nèi)存優(yōu)化與LeakCanary的源碼?以及LeakCanary的缺點(diǎn)和如何解決。
簡答:LeakCanary 本質(zhì)上是注冊監(jiān)聽了四大組件的生命周期,當(dāng)生命周期銷毀時(shí)候,通過一個(gè)弱引用包裹該Activity/Fragment 等組件對象,并循環(huán)檢測該對象是否銷毀了。解決方案,可以通過ReferenceQueue+虛引用。當(dāng)GC時(shí)候會把這些引用對象添加到引用隊(duì)列中,接著通過ReferenceDeamon守護(hù)線程把數(shù)據(jù)保存在ReferenceQueue靜態(tài)變量中,在ReferenceQueue的poll可以拿到。
- 9.算法:數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請找出這個(gè)數(shù)字(Leetcode原題)。
字節(jié)2面
1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及優(yōu)化的原因
2.Rxjava源碼原理,以及項(xiàng)目中你是如何將Rxjava流進(jìn)行復(fù)用。
簡答:模仿DisposeObserver,當(dāng)ObservableCreate 調(diào)用onSubscribe后就會關(guān)聯(lián)從上流到下流的關(guān)系。并通過cas設(shè)置到當(dāng)前執(zhí)行包的全局變量中。當(dāng)?shù)诙问褂猛粋€(gè)流調(diào)用onSubscribe關(guān)聯(lián)再度關(guān)聯(lián),就會dispose當(dāng)前的rxjava流。只需要處理這一步驟即可。
詳情閱讀Rxjava源碼解析。
- 3.你項(xiàng)目中高度自定義了DiskLRUCache。問LRUCache的實(shí)現(xiàn)?問LinkedHashMap的實(shí)現(xiàn)?問DiskLruCache的實(shí)現(xiàn)?問Glide中實(shí)現(xiàn)的DiskLruCache的運(yùn)用。
- 4.Handler的原理
文章:
5.
volatile原理6.
synchronize鎖的轉(zhuǎn)化流程。
簡答:偏向鎖轉(zhuǎn)化瘦鎖(owner thread id不一致且沒上鎖),瘦鎖轉(zhuǎn)化胖鎖(64次獲取不到鎖后)。
- 7.
ReentrantLock實(shí)現(xiàn)。
簡答:由AQS(AbstractQueuedSynchronizer)實(shí)現(xiàn)。ReentrantLock 分為公平鎖和非公平鎖。AQS本質(zhì)上是調(diào)用acquire 時(shí)候?yàn)楸揪€程添加到同步隊(duì)列中,每一個(gè)線程代表一個(gè)Node,在每個(gè)Node會自旋競爭同步隊(duì)列中的狀態(tài)。公平鎖需要多一個(gè)判斷,就是保證自己是頭節(jié)點(diǎn)。
8.ui 優(yōu)化,首屏渲染時(shí)機(jī)優(yōu)化
9.啟動(dòng)優(yōu)化,與AlphaManager的實(shí)現(xiàn)。
-
10.插樁的原理以及運(yùn)用。
- ASM
- Javapoet
- 動(dòng)態(tài)代理
11.LiveData 和 ViewModel的源碼實(shí)現(xiàn)
12.x2c 源碼實(shí)現(xiàn)
13.DNS 原理
14.https的原理
13和14可以閱讀(Android網(wǎng)絡(luò)編程 總覽)[http://www.itdecent.cn/p/ba60ff3c56e6]
- 13.算法:判斷一個(gè)字符串是否是回文串(注意保證原字符串不可改變,可用O(n)的空間復(fù)雜度)。
方向:棧的考究。
字節(jié)3面 Leader面
1.工作軟技能的考核,以及團(tuán)隊(duì)中的定位
2.如何進(jìn)行io 優(yōu)化,指標(biāo)是什么,優(yōu)化后的結(jié)果以及參數(shù)是多少?
方向:可以使用/proc/pid/stat讀取cpu的idle,iowait等。使用mmap優(yōu)化后的結(jié)果。
- 3.算法:在一個(gè)單鏈表中,每k個(gè)節(jié)點(diǎn)進(jìn)行反轉(zhuǎn),無法被反轉(zhuǎn)的部分放在末尾。
騰訊面試
騰訊的面試風(fēng)格,普遍是基于你的簡歷上項(xiàng)目經(jīng)歷,往細(xì)節(jié)往深處問。我是面試因算法失敗了一次,后面第二次就成功了。
總結(jié)一下2次騰訊面試
騰訊第一次面試1面
1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及原因
2.ARouter 源碼實(shí)現(xiàn),項(xiàng)目中對ARouter的擴(kuò)展實(shí)現(xiàn)詳細(xì)設(shè)計(jì)
3.ui 優(yōu)化,啟動(dòng)優(yōu)化,首屏展示時(shí)機(jī)優(yōu)化
4.
volatile實(shí)現(xiàn)5.Java異常捕獲
13.DNS 原理
14.https的原理
6.jni 中JNIEnv 和線程的關(guān)系
簡答:線程私有,需要JavaVm 重新獲取一個(gè)jnienv 調(diào)用attachThread 方法把線程和新的JNIEnv 綁定起來。
- 7.jni中有幾種注冊native方法。
簡答:2種,動(dòng)態(tài)和靜態(tài)。關(guān)于整個(gè)流程中關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系可以看下面這篇文章的流程圖:
JVM引擎執(zhí)行總結(jié)
- 8.Native異常捕獲
簡答:通過sigaction保存系統(tǒng)默認(rèn)的處理信號方式,sigaddset 保證一次只關(guān)心一種信號,sigaction 設(shè)置自定義的信號處理方法。在自定義的信號處理方法中,進(jìn)行unwind_backtrace 處理,通過_Unwind_GetIP獲得native棧信息保存起來,并拋出異常。同時(shí) 當(dāng)前方法地址 和 so的地址獲取 相對地址,最后通過addr2line 解析 出是so庫中哪一個(gè)方法。
騰訊第一次面試2面
1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及原因
2.ARouter的實(shí)現(xiàn),以及自定義擴(kuò)展ARouter的實(shí)現(xiàn)
3.項(xiàng)目中的io 優(yōu)化,以及為什么用mmap于io優(yōu)化
4.mmap的實(shí)現(xiàn)
5.mmkv 中 對應(yīng) mmap 斷電時(shí)候的處理機(jī)制
6.mmap沒調(diào)用msync時(shí)候,落盤時(shí)機(jī)。
簡答:進(jìn)程死亡
詳情看
- 6.算法:合并三個(gè)單鏈表(可參考leetcode 合并多個(gè)單鏈表)
因?yàn)樽约寒嬌咛碜?,把每一個(gè)節(jié)點(diǎn)拷貝了一次,還沒有往后迭代,實(shí)在是錯(cuò)漏百出就掛了。腦袋還是不夠清醒,結(jié)果飲恨而歸。
騰訊第二次面試1面
1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及原因
2.ARouter 的實(shí)現(xiàn),以及擴(kuò)展的實(shí)現(xiàn)
3.啟動(dòng)優(yōu)化,以及ARouter的啟動(dòng)優(yōu)化方式,ARouter的分區(qū)方式
4.Navigation的源碼解析
5.基于Navigation 編寫路由框架NavigationRouter 的源碼實(shí)現(xiàn),以及實(shí)現(xiàn)的優(yōu)點(diǎn)
6.Navigation 實(shí)現(xiàn)的路由框架中如何處理Activity和Fragment 嵌套啟動(dòng)的方式
7.class的加載流程
文章:class 文件初識
- 8.Handler的實(shí)現(xiàn)
文章:
最好能回答到epoll和eventfd的層面
- 9.實(shí)現(xiàn)一個(gè)多線程下的消費(fèi)者生產(chǎn)者模式
騰訊第二次面試2面
- 1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及原因
- io 優(yōu)化 與 使用
mmap的優(yōu)勢和缺點(diǎn)
- io 優(yōu)化 與 使用
- 3.ARouter 的實(shí)現(xiàn),以及擴(kuò)展的實(shí)現(xiàn)
- 4.多進(jìn)程實(shí)現(xiàn)的路由
- 5.如何進(jìn)行多進(jìn)程的同步調(diào)用,此時(shí)另一個(gè)進(jìn)程還沒有啟動(dòng)?
參考答案:橫向淺析Small,RePlugin兩個(gè)插件化框架 中,RePugin是如何通過CP 進(jìn)行跨進(jìn)程同步通信
- 6.數(shù)據(jù)結(jié)構(gòu)中不支持多線程的數(shù)據(jù)結(jié)構(gòu),如果使用多線程操作會造成什么結(jié)構(gòu)
簡答:如HashMap,ArrayMap等不支持多線程保護(hù)原子性的數(shù)據(jù)結(jié)構(gòu)。每一次進(jìn)行put,get操作的時(shí)候,都會對modCount 加一。用于記錄當(dāng)前操作次數(shù)。一旦看是遍歷里面的元素,會不斷檢查該操作前保存的modCount 是否和之前的一致。不一致則拋出ConcurrentModificationException
- 7.
ArrayMap實(shí)現(xiàn)
簡答:ArrayMap 是內(nèi)存優(yōu)化的數(shù)據(jù)結(jié)構(gòu)。核心是由兩個(gè)數(shù)組組成的數(shù)據(jù)結(jié)構(gòu)。第一個(gè)數(shù)組記錄了key對應(yīng)的hashCode,這個(gè)過程會不斷的通過二分法找到hashCode合適的插入位置。獲得的index,index左移動(dòng)1位是key緩存的位置,index左移動(dòng)1位加1則是value的緩存位置。
ArrayMap中的存在一個(gè)靜態(tài)數(shù)組,用來保存大小4/8 開辟過的ArrayMap。如果使用該大小的ArrayMap 則直接使用緩存。
ArrayMap的擴(kuò)容,當(dāng)存儲的數(shù)據(jù)大小大于等于hash存儲的數(shù)組大小則擴(kuò)容,小于4擴(kuò)容位4,大于4小于8擴(kuò)容成8,如果大于8則擴(kuò)容成原來的1.5倍。
每一次remove 發(fā)現(xiàn)是存儲的數(shù)據(jù)是當(dāng)前容器大小的1/3,則壓縮一半。
- 8.
HashMap與ArrayMap比較,兩者的優(yōu)缺點(diǎn)
簡答:
-
數(shù)據(jù)結(jié)構(gòu)上:
- 1.ArrayMap 是兩個(gè)數(shù)組組成的是為了內(nèi)存優(yōu)化而生;
- 2.HashMap 采用數(shù)組+鏈表+紅黑樹
-
內(nèi)存優(yōu)化:
- ArrayMap 更加節(jié)省內(nèi)存,因?yàn)槭且粋€(gè)內(nèi)存中連續(xù)開辟的數(shù)組,不易產(chǎn)生內(nèi)存碎片
- HashMap 以entry的方式保存key和value,對內(nèi)存的利用率低
-
性能上:
- Arraymap 查找時(shí)間是O(logN) 級別(二分法),刪除和增加成員需要移動(dòng)成員,速度慢,小于1000的情況下沒有區(qū)別
HashMap 增刪的時(shí)間復(fù)雜度就是O(1)
-
緩存機(jī)制:
- ArrayMap 針對大小4和8的都有緩存。避免頻繁GC,兩個(gè)緩存池的大小上線為10
- Hashmap 沒有緩存
-
擴(kuò)容機(jī)制:
- ArrayMap是在容量滿的時(shí)機(jī)觸發(fā)容量擴(kuò)大至原來的1.5倍,在容量不足1/3時(shí)觸發(fā)內(nèi)存收縮至原來的0.5倍,更節(jié)省的內(nèi)存擴(kuò)容機(jī)制
- HashMap是在容量的0.75倍時(shí)觸發(fā)容量擴(kuò)大至原來的2倍,且沒有內(nèi)存收縮機(jī)制。
9.handler 的原理
10.handler 是怎么進(jìn)行postDelay 延時(shí)操作。
簡答:postDelay 會將延時(shí)+當(dāng)前的時(shí)間戳,插入到MessageQueue的合適位置。每一次消費(fèi)判斷時(shí)間到達(dá)延時(shí)的時(shí)間點(diǎn),再進(jìn)行消費(fèi)。
- 11.當(dāng)handler 只有一個(gè)延時(shí)的message時(shí)候,Looper中是如何運(yùn)行。
簡答:通過pollOnce 調(diào)用epoll 進(jìn)行阻塞。
12.
volidate原理13.當(dāng)沒有添加
volidate修飾屬性的時(shí)候,數(shù)據(jù)什么時(shí)候從緩存行刷新到主存。
簡答:當(dāng)從synchronized 代碼域離開的時(shí)候;當(dāng)線程結(jié)束時(shí)候;當(dāng)調(diào)用synchronized方法;當(dāng)?shù)谝淮卧L問線程的某個(gè)屬性。
- 14.算法題:在一個(gè)n*n的方格中。有兩種方格,1代表阻塞不能經(jīng)過,0代表可達(dá)。兩點(diǎn)坐標(biāo),a和b。問a到b的最短路徑。
騰訊第二次面試3面和4面
騰訊3面和4面是聯(lián)系到一起的,這里一起說了
1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及原因
2.
mmap實(shí)現(xiàn)原理和io優(yōu)化3.View的繪制流程,從
setContentView解析xml到View的繪制結(jié)束。
設(shè)計(jì)的內(nèi)容極多和廣泛,建議看我寫的如下系列文章:
4.硬件渲染流程
5.SurfaceFlinger 在 View繪制流程中扮演的角色
- Choregrapher 的工作原理
關(guān)于5和6兩個(gè)問題可以詳細(xì)閱讀系列文章: SurfaceFlinger的概述
7.OOM 如何優(yōu)化,內(nèi)存爆滿是虛擬內(nèi)存容易先爆掉還是物理內(nèi)存容易,一口氣映射4g的內(nèi)存是否會發(fā)生異常。
8.Bitmap 如何優(yōu)化避免OOM,為什么放在native中bitmap不容易OOM
9.一個(gè)進(jìn)程最多可以使用多少fd
10.你研究過RN和Flutter,RN的渲染機(jī)制和Flutter的渲染機(jī)制是如何運(yùn)作的?他們之間區(qū)別是什么?
關(guān)于RN和Flutter的文章,之后有機(jī)會會和大家分享出來。
目前來說可以去看看gityuan 的博客,里面有詳細(xì)的介紹了Flutter的通信流程和渲染流程。
而RN的渲染流程倒是很多相關(guān)的文章,建議直接結(jié)合文章看最新的源碼,不是特別的難。
- 11.插件化你是如何實(shí)現(xiàn)的。
詳細(xì)可以閱讀橫向淺析Small,RePlugin兩個(gè)插件化框架 這篇文章有詳細(xì)的解析了整個(gè)hook的原理和流程。
- 12.算法1: 將一個(gè)int的數(shù)字轉(zhuǎn)化成漢語說法。如10000轉(zhuǎn)化為一萬。
簡答:方向是除余,除法移動(dòng)int,并保存到棧中。然后推出,生成漢語說法
- 13.算法2:中國下棋的馬,能否吃掉另一個(gè)坐標(biāo)的旗子,請找出坐標(biāo)
簡答:廣度優(yōu)先算法,遍歷8個(gè)方向。
騰訊二次面試5面
本次面試是兩個(gè)面試官進(jìn)行考察,考察的東西偏向網(wǎng)絡(luò)協(xié)議。
1.自我介紹,項(xiàng)目經(jīng)歷,項(xiàng)目上的優(yōu)化項(xiàng)以及自己開源在GitHub上項(xiàng)目的特點(diǎn)。
2.當(dāng)遇到弱網(wǎng)絡(luò)時(shí)候的優(yōu)化
簡答:1.HttpDns,并解釋DNS的原理。2.QUIC協(xié)議替換TCP協(xié)議,介紹QUIC的原理和TCP的區(qū)別。3.接口的適當(dāng)合并,并結(jié)合項(xiàng)目的運(yùn)用方案1
3.當(dāng)遇到弱網(wǎng)絡(luò)時(shí)候,網(wǎng)絡(luò)是如何進(jìn)行文件重傳
4.當(dāng)遇到弱網(wǎng)絡(luò)時(shí)候,手機(jī)連接上了4g,但是沒有數(shù)據(jù)流量時(shí)候,如何檢測并恢復(fù)。
簡答:fb的network-connection的庫有實(shí)現(xiàn)。本質(zhì)上就是通過一個(gè)線程不斷的輪訓(xùn)查詢TrafficStatus中的4g+wifi數(shù)據(jù)的狀態(tài)。核心是調(diào)用了下面兩個(gè)Linux命令:
// stats接口提供各個(gè)uid在各個(gè)網(wǎng)絡(luò)接口(wlan0, ppp0等)的流量信息
/proc/net/xt_qtaguid/stats
// iface_stat_fmt接口提供各個(gè)接口的匯總流量信息
proc/net/xt_qtaguid/iface_stat_fmt
- 5.當(dāng)app在播放音視頻的時(shí)候,需要注意的要點(diǎn),以及相關(guān)的實(shí)現(xiàn)。
總結(jié)
從專業(yè)技能考察可以看到,實(shí)際上整個(gè)面試過程。騰訊面試的會相對仔細(xì)一點(diǎn),技術(shù)廣度更加廣一點(diǎn);而字節(jié)則更加偏向基礎(chǔ)是否扎實(shí)。都是從你的簡歷項(xiàng)目,技術(shù)點(diǎn)開始詢問,并根據(jù)你回答的問題,不斷的調(diào)整詢問的方向,不斷的向下挖你的知識點(diǎn),看能達(dá)到什么程度
但是無論如何,你回答的層面最好足夠深,從源碼層級說起來。有時(shí)候面試官的對問題的看法和你的看法有分歧,此時(shí)就需要你是否可以從源碼的層面上對這些問題有自己的解釋。
面試的專業(yè)難度沒有想象的困難,可以看到大部分的知識都是我在重學(xué)系列和往年寫的第三方庫的分析都有覆蓋。
而這些知識我寫出來花了3年,實(shí)際上學(xué)進(jìn)去就不需要??梢哉f大部分人都能達(dá)到的水平,因此面試的時(shí)候只需要沉著冷靜的思考,從源碼的角度對面試官拋出來問題進(jìn)行分析,就能比較輕松的解決。
最后有人好奇我去了哪里。應(yīng)該是去騰訊。