字节跳动抖音ios客户端开发实习生一面面经
整個一面過程持續了接近一個小時。面試官是字節跳動校招宣傳片中的人物,我對他印象很深刻,因為他是北大法學院的畢業生轉行做了程序員。
零、自我介紹
一、問項目
1.在做中國象棋游戲這個項目中遇到的最棘手的問題是什么?
答:人機博弈中最佳走棋步驟的生成。
2.你是如何解決這一問題的?
答:min-max算法。但是遞歸層數太多的話運行到后面會崩掉。
3.min-max算法中有個剪枝你了解嗎?應用了嗎?
答:完全不了解,純暴力。
4.你這個中國象棋游戲是單擊的,如果把他搬運到線上你會怎么操作?
答:在服務器中建一個數據庫,每場對局都建一張表,表中存放的各種棋子的信息,比如表頭是棋子id、坐標、是否死亡;
再就是視角轉換,棋盤一共有m行n列的話,紅方看來坐標是(i,j)的棋子,在黑方開來就是(m-i-1,n-j-1)。
5.如果用數據庫的話,每個對局都要建一張表,數據庫是在磁盤上的,速度會很慢,你有什么解決方法嗎?
答:我并不了解這一塊,但是我知道有運行在內存中的數據庫,比如redis,這樣就會增加訪問速度。
二、問算法
1.給出一棵二叉樹和兩個結點,找出兩個結點的最近公共祖先結點。
(1)請寫出代碼并說出思路。
答:我很快就寫出來了。先中序遍歷,用map存結點在中序遍歷中的下標(從0開始),在中序序列中,如果兩個結點一個在當前結點的左邊,另一個在當前結點的右邊,那么當前結點就是最近公共祖先結點。
(2)如果給出的結點不存在那map出來的下標就是0,這樣會出現混亂,對此你如何解決?
答:讓中序遍歷的下標修改為從1開始,這樣如果map出來下標是0就說明給出的某結點不在這棵二叉樹上。
(3)你這個算法的時間復雜度是多少?
答:中序遍歷是O(n),找最近公共結點是O(logn)。
2.青蛙蹦石頭,給出一個從0開始的數軸,坐標都是整數,給出一個數組表示有石頭可以讓青蛙落腳的坐標,青蛙只能往右跳,第一次跳的時候只能跳1,后面青蛙再跳的時候,如果上次跳的距離是n,那青蛙本次跳的距離只能是n-1,n或者n+1,問青蛙能不能跳到終點。
(1)不用寫代碼,只說思路。
答:bfs,每次都把下次能到的點入隊。
(2)你這樣太暴力了,有沒有更好的方法?
答:我想了一會,沒想出來。
(3)你聽說過dp嗎?能不能用dp把這道題解出來?
答:我覺得算法中最難學的就是dp(動態規劃)了,我打ACM的時候,每次遇到dp的題都是讓隊友上。
(4)好吧。那bfs算法解本題的時間復雜度是多少?
答:青蛙每次都面臨三種選擇,應該是O(3^n)吧。
三、問網絡
一面和二面是連在一起的,有些問題一面和二面都問了,或者是一面問的問題過于基礎,我忘了是不是屬于一面了,就只說我印象最深刻的。
1.你了解http協議嗎?
答:http是這樣連接的:(我把http連接前面的DNS說了)。
2.你說的是http的連接,對于http本身你有什么理解?
答:我并不十分了解http協議,但是學校里開了一門Web開發的課,我只知道里面的get和post。
3.說一說get和post的區別?
答:get就是獲取服務器傳回的信息,post就是向服務器發送請求啊。
4.你有沒有想過如果用get請求用post接收會怎樣?
答:沒想過。
四、問操作系統
1.進程和線程有什么區別?
不多贅述了。
2.一個程序在什么場景使用多進程在什么場景使用多線程?
答:由于進程切換耗費資源,線程切換相比之下不那么耗費資源。我所了解的程序大都使用多線程,沒有聽說過用多進程的。
3.你在回答進程和線程區別的時候有一點說得很好(我忘了是哪點了,類似給了點提示),你現在對上面的問題有想法了嗎?
服務器程序簡歷與客戶端的通信時需要fork一個進程,因為每個客戶端都”配擁有姓名”,保存專屬于某個客戶的上下文。因此服務器程序可能會使用多進程。
五、約二面
面試官:我們這一輪的面試就到這里結束了,我聯系一下二面面試官,你休息休息,一會二面。
歡迎大家關注/訂閱我的微信公眾號Code Art Online,我會在我的公眾號分享個人見聞,發現生活趣味;這里不僅有0和1,還有是詩和遠方↓↓↓
總結
以上是生活随笔為你收集整理的字节跳动抖音ios客户端开发实习生一面面经的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: liferay实战
- 下一篇: (翻译)色彩饱和度影响用户效率的方式