杭州雙非渣碩。前段時間師兄內推雷火,沒有筆試直接打電話約我去面試了,地點在網易大廈。早上不到七點起床,晚上七點多才回到宿舍,可以說是很疲憊了。
本來面試現場投影上寫的上午三輪交叉面,如果通過的話下午一輪總監面一輪hr面。 結果我上午三面完了之後,下午又給我來了四輪面試,沒有總監面和hr面,所以一共7輪技術面(第一次參加面試就這場面,吃不消吃不消),還好都是1v1的形式。
因為對第一輪面試印象深刻一點,就單獨說一下,其他六輪題目我可能搞混,索性後邊直接一起列出來了。
一面:面試官很年輕,看樣子就比我大幾歲,感覺技術很強,有種鄰家大哥哥的感覺。。。
- 一開始讓自我介紹;(有沒有問我專案記不清了,反正後邊幾面也有問到)。
- 然後給我一張紙,讓我把知道的排序方法都寫下來,(我寫了六七種吧記不清了,主流的都寫了,包括希爾排序 桶排序),然後讓我把他們的實現方法都介紹一下,然後時間複雜度 空間複雜度都寫一下,把他們是否穩定都寫一下;
- 你瞭解的最複雜的資料結構是什麼?(我一開始說的雜湊表,問我有沒有更復雜的,我說各種樹,紅黑樹,B+樹,B樹,平衡樹等等)問我這些可能都是本科時候學的,現在還記得起來麼?(能記得大概,具體的左旋右旋可能細節想不起來);ps:其實我還是能說出來一點的,但是當時慫了怕讓寫出來就gg了;
- 兩個平衡二叉樹合併怎麼做?(一開始以為就是簡單的比較大小+遞迴,後來發現好像還得滿足高度的特性,就先說了平衡二叉樹的特點,然後想了一小會,面試官說不會也沒關係,恩不會);
(4.9日修改:今天才發現平衡二叉樹其實只要求高度差不大於1,並不要求左子樹比根小,右子樹比根大... 有這種要求的是紅黑樹。我記錯了! 這樣的話 合併兩顆平衡二叉樹其實就是層序遍歷吧,唉當時要是沒記錯就可以擼出來 了。。。)
- 現在有100W個賬戶密碼,要存起來,要求查詢時速度儘可能快,你選擇什麼資料結構?(B+樹);
為什麼?(我簡單扯了扯B+樹的特性);
說一下要往裡插入、刪除、查詢賬戶密碼的複雜度。(我不太確定,瞎猜的:nlogn,nlogn,logn); - 對圖論演算法瞭解多少?(BFS,DFS,最短路徑,最小生成樹,最小割最大流...)平常有用過嗎?(專案裡用過DFS BFS);
- 好,現在給你道題,一個二維座標系,給你n個點的座標,畫一條直線把他們分成兩份(任意直線),要求數量儘量等分,複雜度不能太高。
(剛說完圖就出這道題,我下意識覺得考察我圖論,想了一下感覺不是的,然後給他講了講我的思路:假設按照y座標分,那麼遍歷n個座標,用一個最大堆來儲存,然後從頂部彈出n/2次,如果當前頂部的數和最後彈出的數不一樣,就可以在中間畫一條線);
他說如果所有點縱座標都一樣呢?如果有點重合的呢?
(我有點矇蔽了,覺得我這思路是錯的,又想了幾分鐘其他的方法,又不由自主往圖論上想,最後還是沒想起來。其實貌似再同樣做法對橫座標處理一次應該可以避免他說的問題吧),最後問他怎麼做,他說用二分的思想,然後對橫縱座標求中位數、眾數什麼的,我也沒太聽懂,裝模作樣點了點頭; - 玩過哪些遊戲?(說了一大堆)對哪個比較熟?(LOL) 現在讓我對亞索的e做測試,怎麼測?(我吧啦吧啦一大堆把能想到的都說的,ps:這裡之前問過師兄經驗,要有條理,用樹狀圖來測,先分成幾大類,再慢慢細分之類的)。但最後面試官又提醒我e技能帶不帶普通攻擊,會不會觸發裝備特效?(這點確實沒想到,但也是提醒了我,後邊幾輪面試也有問測技能的,我就把這一點都說上去了)。
- 問我亞索的e在一小段時間內是不能對同一目標使用的,怎麼測?(簡單說了一下) 你覺得不能對一個目標釋放e的判斷是怎麼實現的(我一開始說物件導向,對每個單位物件設定時間標記之類的。後來他說不是物件導向,提醒我是buff還是什麼,我說是buff);
- 在e的瞬間敵方回城了你覺得應該被帶到泉水嗎?(不應該)。
那dota裡白牛的大招會不會?(會。ps:因為我也玩過dota);
你覺得是為什麼?(可能在程式碼實現上白牛的大招是在大招釋放完畢後出現在目標的身後); 那亞索怎麼避免這樣?(可以在釋放技能時根據目標和自己的位置關係計算出技能釋放後的位置,而不是以釋放後的目標位置為參照物);
你覺得這樣可以解決嗎?(可以); - 討論bug和外掛的問題:
- 面試官小聲嘀咕+心算“你現在研二...dota高中玩的....恩應該是6.72版本”。
(我內心:???臥槽! 這都能算出來)。 - 說一下你當時玩dota的時候發現的bug。
(我內心:???dota做得這麼好,哪裡有bug啊。 想了一會說 確實沒發現); - 當時某種情況下蝙蝠開大招的時候可以A自己的塔,是最出名的bug。
(我內心:??? 還有這種事? 我怎麼不知道) - 說一下dota 的外掛吧。
(??還有外掛? 哦對 開圖掛) - 那你知道原理是什麼嗎?
(我內心:???臥槽 我說我不知道開圖的效果是怎樣的,所以不好說原理,是整個地圖戰爭迷霧都沒了嗎?還是隻對英雄有記號?) - 顯然面試小哥也沒開過全圖不知道效果 那你說說LOL的外掛吧。
(??lol還有外掛? 我趕快扯開 我還玩過穿越火線,那個外掛特別多) - 都有什麼你說說看。
(顯示幽靈,透視,穿牆,自動瞄準,飛天 入地。。。) - 那你知道原理嗎?
(我內心:??臥槽 到底還是沒躲過 我說曾經幽靈模式剛出來的時候,可以通過刪除安裝目錄下的一個檔案,來使幽靈的刀子顯形,而且我也確實試過是可以的) - 面試官點點頭 算是混過去了;
- 可能還有暫時想不起來了...
- 有什麼要問我的麼?(問了一下我理解的防護就是測開,需要對做抵禦外掛的工作嗎?) 也要做的,這個東西不想做也避免不了。 結束。
其餘六面:
- 除了最後一面面試官覺得我已經比較累了,其餘的都要自我介紹;
- 專案被問了好幾次,包括具體實現,專案主要解決的問題,從專案中學到的最好的技術,專案經驗對做我們這個崗位的好處(因為我的專案就是可靠性自動化測試) 等等;
- 很多測試場景題,包括測技能,測英雄,登入視窗等等,問你怎麼測;
概率題:
兩盒火柴每盒n根,每次隨機從任意盒取出一根, 求當一個盒子被取完時,另一個盒子剛好還剩r根的概率。
(有點緊張有點懵逼,最後答錯了,但還是講了一下思路寫了一下我的公式雖然可能是錯的但總歸沒放棄抵抗~) ;
智力題:
- 兩個盲人各買了一白一黑兩雙襪子,不小心弄混了,問他們自己怎麼分成剛好每人一白一黑。
(之前見到過,稍微想了一下就答上來了。但是先入為主是我理解的那樣了,面試官問我為什麼覺得襪子都是一樣大的,不可以用手區分開?當然實際上我問的話 她肯定說是一樣大的 只憑手感摸不出來~); - 一個圓桌,兩個人往上放硬幣,只能平鋪不能重合,最後一個放的人勝利(接下來硬幣無處可放了),問先放的贏還是後放的贏。
(初中就見過的題,直接跟他說這題我做過,然後講了一下秒殺之);
測試知識題:
- 說一下了解的測試方法;
- 效能測試有哪些指標;比如對一個登入功能做效能測試,有哪些指標?(響應時間,可同時處理的最大請求數量...) 怎麼測出可同時處理的最大請求數量? (秒答 二分)面試官會心一笑 “恩 二分 沒問題” ;
- 用什麼做的單元測試(junit);
- 有沒有做過壓力測試(沒有);
- 面試官看到我的專案裡有提到流程圖,於是問了以下題目:
- 任務流程圖,是序列的,比如跟一個個NPC對話,但是有可能有的玩家提前跟某個NPC對話,導致後邊的任務出不來了,這種情況下怎麼測?(把序列的所有任務全排列)。
- 如果當任務太多了會怎樣?(那測試用例數量要爆炸了)
- 怎麼優化?(想了一會想不出來,硬憋一下 問能不能用 堆排序的思想,先兩兩顛倒順序測試,把已測試過的當成一組再兩兩測,這樣測試用例應該減少很多)。
- 面試官還不太滿意,讓從遊戲的角度來說,(我實在不太會,又說根據重要程度,比如正常的流程肯定是最重要的,然後根據日誌,玩家走得比較多的流程 來排序,重要度高的分配更多測試資源)。
- 最後面試官說他們現在就遇到了這個問題,然後講了下他的思路;
- 還有很多,一時想不起來了;
java基礎:
- protected,public,private的區別(面試官說我protected說的不太對);
- 抽象類和介面的區別;
- static的作用;
- List和ArrayList的區別;
- int和Integer的區別;
- 全域性變數,臨時變數,靜態變數分別存在哪裡;
- c++和java 的區別;
- java記憶體裡有什麼(結構);
- 說說垃圾回收機制(忘得差不多了,加上知道自己已經忘得差不多了更加緊張, 就把能想起來的隨便說了說);
- 怎麼判斷哪些物件是可以刪除的? 可達是什麼意思?
- 介面有什麼限制;
- 可能還有一些,暫時想起來這麼多;
資料結構:
- 講一下你知道的資料結構;
- 有一些數,每次可以插入,或者取出第1/4大的數,用什麼資料結構?
(我回答:維護當前資料量1/4大小的 最小堆,插入時被擠出來的數用最大堆儲存,取操作從最小堆頂部取,然後把最大堆頂部取出插入最小堆。 瞎說的不知道對不對 不過看面試官當時的態度反饋 應該還算滿意); - 陣列和連結串列的區別;
- BST的特點;
- 應該還有,記不清了;
演算法題:
- 求a和b的最大公約數;
(講思路,一開始想的是用最小的數往下遞減,每次判斷另一個數能不能被整除;剛說完就優化了一下,改成不是每次遞減,而是用除以2,除以3...這樣找。 我知道好像有公式還是什麼的...但我真的想不起來了); - 字串轉int型別,要求不能用已有的方法,也不能強轉。
問了下其他的要求,比如+-號之類的,還有不是數字的字元返回error等。還問了如果超過int最大值怎麼辦,他問int最大值是多少(214..什麼的,具體不知道..我平常都直接用的Integer.MAX_VALUE),好吧 這樣也行算你過了。
(ok,紙上手撕,用的 str.charAt(index)- '0'做的,但最後還是16進位制標記0x沒有考慮到); - 求x的n次方,已知可以用n*(n-1)!來做,但有沒有更好的方法。
(ok,紙上手撕,前兩天剛好看到了, 先對x,n判斷是否是負數,0之類的, 然後把n轉成2進位制,通過&1和右移來做); - 給一個二叉樹,怎麼得到這顆樹的映象。(簡單題目, 講了下思路,遞迴,左右對稱就好了);
- 01揹包
(ok,紙上手撕,dp,很久沒寫了對這個不太熟,一開始用的一維來寫的發現錯了,後來改成二維寫出來了); - 給一顆樹,判斷是不是BST。
(ok,紙上手撕,用的遞迴,方法裡有max和min兩個約束,不符合直接返回false,初始是Integer.MAX_VALUE和Integer.MIN_VALUE往左遞迴時更新max,往右遞迴時更新min。)
面試官自己在紙上畫了畫,表示第一次見到我這種方法,但好像也沒啥毛病,恩沒毛病~; - 說兩個nlogn複雜度的排序方法,衡量演算法的三個維度?快排是穩定的嗎?快排基準點怎麼選擇?
(這已經是第六面了,我一直以為穩定是指複雜度的穩定,結果經面試官提醒才知道理解錯了... 這樣想起來一面時候讓寫的穩不穩定怕是也錯了); - 印象中還有讓講思路的題目,但實在想不起來題目了。
演算法總結:
紙上手寫還是跟平常自己做的時候感覺不一樣的,自己太急了,沒仔細想好就開始寫,導致寫錯的要劃掉很難看,還有寫完了沒有檢查程式碼,一些特殊情況也沒太多考慮。 主要是面試官在旁邊,不好意思讓他一直等著,就老想趕快寫完得了。還好面試官挺好的,不是很苛刻,不然小細節能懟死我。
其他題目:(想到哪說哪,完全亂序的)
- 其他語言會嗎?(幾乎不會)
- 專案是Windows的是嗎?不是網頁的(對);
- 寫過web專案嗎?(最近寫了一點,用的spring boot);
- 專案規模(兩到三人);
- 有人專門負責前端是嗎(對);
- 資料庫是用的MySQL嗎?(是的)那平常資料庫的語句都是怎麼寫的?(用啥網上查啥)join作用(不會)想刪除一行怎麼做(delete);
- 遊戲手感是什麼?能不能用資料來描述?
- FPS啥意思?(幀) 幀是什麼?(畫面)你真的理解FPS是什麼嗎?(我想了幾秒,恩...FPS是越高越好,是每秒的幀數,當足夠大的時候,肉眼看起來就像是連貫的) 說到這裡面試官終於點了點頭;
- 讀過什麼原始碼嗎?(只讀過java的一些原始碼)比如什麼(HashMap,我想你趕緊問問我好吹一波,結果面試官可能對這個不太熟 就沒繼續問下去);
- 還有很多想不起來了。