1. 程式人生 > >記 今日頭條廣告架構社招面試

記 今日頭條廣告架構社招面試

部門是廣告下架構部門,主要偏廣告日誌處理方面;

之前面試過頭條財經業務部,其面試題基本以常見演算法題和leetcode原題的形式出現,而頭條廣告部門的演算法面試題基本是開放性演算法題,更加註重對資料結構演算法的理解及運用、以及問題轉化為資料結構演算法解決方案的反應速度,簡單說就是,側重對"內功"的考察;

一面:確切說還有第0面,上去連簡歷都完全不看(確切說是沒有),直接白紙出一道題,給一刻鐘時間解答,答對再進入正式的一面;

面試題:醫院有M個醫生,需要做的手術的手術時間用一個數組來描述,比如第2分鐘、第5分鐘、第8分鐘等等,要求寫一個函式,返回每一個手術由哪個醫生做,要儘可能安排合理,即避免發生有的醫生做很多手術有的醫生一直在閒置的情況;

當時看見有點蒙,後來想到了個辦法是用堆,建立一個類struct worker {int docid; int endtime;}描述每個手術的醫生和手術結束時間,並重載<運算子,以手術結束時間endtime為判斷大小的小頂堆;對於第1-M個手術,就建立一個這樣的類例項並放入堆,並返回醫生id(1-M);當M個手術即處理第M + 1個手術時,找堆頂返回該醫生id,建立新手術元素push到堆,並判斷如果當前時間和堆頂元素的endtime,當前時間就是當前手術是第幾分鐘開始即陣列元素裡的時間,如果當前時間大於endtime,則還要pop掉堆頂元素;該方法及程式碼得到面試者同意;

然後問了問專案,專案問的細緻程度一般,問了問c++一些基礎等等;

二面:二面也是先一道題,然後一道題,然後問專案和基礎;

第1題:有一個N面的骰子,每一面出現的概率已知,要求寫一個函式返回每次投擲結果,要反映各面的概率;

想了想發現用區間比較好解決,因為所有面的概率之和為1,那麼建立一個類struct interval {int value; double start;}並放入vector描述骰子各面出現的範圍,然後每次投擲用隨機函式生成0-1的浮點數,並判斷浮點數落在哪個範圍,判斷方式就是判斷第一個大於浮點數的vector的元素(stl的lower_bound)即可;該方法貌似不是面試者預想到的解決方法,但也得到了認可,然後他又來一道題;

第2題:想喝N瓶酒,每K個空瓶換一瓶新酒,問需要幾瓶;

此題相對大眾一些,直接用遞迴加剪枝實現;問還有沒有更好的方法,然後他發現我正在寫動態規劃時直接叫停,說不用寫了;

然後問專案,二面明顯問的較細,包括分散式容災、多節點資料同步等方面,以及一些工作以外之類,問的都比較細緻;

總結:刷題的目的,不(僅)是指望面試時出現原題或簡單變換後近似的題,而是逐漸潛移默化,培養出一種”內功“,形成對普遍的資料結構演算法的深刻認識和場景運用,理解的越熟越深刻,反應就越快,而且思路也越多且靠譜;這不僅是面試管用,平時工作遇到這種區域性問題需要解決時,也多多少少有一些益處;