百度AIG知識圖譜部算法實習生面經(已拿offer)

一面:

1.自我介紹html

2.平時用什麼編程語言比較多java

python,另外學過C語言和JAVApython

3.c語言裏指針佔多少內存c++

答成8位了,應該根據機器而言是16位或32位面試

4.python裏的map函數,講一下它的做用和返回值算法

傳入一個函數和一個list,將這個函數做用於這個list的每一個元素上.返回值是一個新的list.編程

5.什麼是梯度降低法數組

6.手寫代碼:歸併兩個有序數組數據結構

7.知不知道什麼數據結構的查找的時間複雜度是O(1)框架

哈希表,也就是python中的dict

8.哈希表的原理是什麼

利用哈希函數映射,構造出一個鍵值對

9.手寫代碼:兩個大文件a和b,每一行存儲的都是一個字符串,找出其中在兩個文件中都出現過的字符串

構造一個哈希表,先逐行讀入文件a,若是該字符串已經在哈希表中就跳過,若是不存在就存入哈希表中.讀完之後逐行讀入b,查找哈希表中有沒有對應的值.

當時用的是dict,面試官說這種狀況直接用set會更好.

10.如何判斷一個鏈表中是否是存在環

一開始理解成是頭尾相連的環,先回答了設頭結點爲一個特殊字符,好比'*',而後一直往下讀取,若是讀到null說明沒有環,若是讀到'*'說明有.

面試官提示說不必定是和頭結點連成環,先回答了相似上面的想法,每一位設一個特殊字符,而後判斷.可是須要用一個額外的空間來存儲被設爲特殊字符的結點原來的值.

面試官問有沒有不須要額外空間的方法,思考了一會想到設立兩個指針,都從頭部開始遍歷,一個指針每次前移一位,另外一個指針每次前移兩位,若是它們相遇就說明存在環,若是遇到null說明沒有環.

面試官問爲何這種方法必定可以找到環.由於假設環的長度是K,前一個指針每次都會比後一個指針多走一步,那麼讓兩個指針一直走下去,確定會存在一個M,使得K是M的因數,而且二者在環內相遇.

11.有一個內存放不下的大文件,每一行存儲的是一個數字,如今要隨機從中取100個數字,怎麼取比較好

先想到直接隨機取一個數M,而後取M~M+100行的數.面試官說沒法肯定文件的大小,那麼這個M也沒法隨機取.

這道題沒有想到太好的思路,後來在網上也沒有找到相似題的答案.

二面:

一面事後一天接到了二面的電話

1.自我介紹

2.知道c++中指針和引用的區別嗎

我表示沒有學過C++,只學過C

3.一個有序數組,如今將它從某個位置翻轉後,如何查找其中的數字

翻轉有序數組問題,首先有序聯想到了二分查找.而後根據查找的狀況修改一下判斷條件便可.由於一個翻轉有序數組從中間截斷後,一定有一邊是有序數組,另外一邊還是翻轉有序數組,那麼問題就解決了.

4.一個有序數組,給定一個k,要將它第k位後的數字總體移到前面去,如何實現

先回答了最簡單的方法,就是新建一個數組,先存入原數組第k位後的數字,再存入前k位數字.空間複雜度爲O(n)

而後又想到一種方法,定義一個操做爲翻轉,能夠經過不停地交換數組兩邊的元素實現.那麼首先翻轉數組的前k個數字,再翻轉數組第k位後的數字,而後再將數組整個翻轉一次就能夠了.空間複雜度爲O(1)

5.一個n步的臺階,每次能夠走1步或2步,走完n步有多少種方法

動態規劃問題,f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)

6.實現斐波那契數列的時間複雜度是多少

上題的動態規劃式子實際上就是斐波那契數列,遞歸實現的時間複雜度是O(2^n),非遞歸實現的時間複雜度是O(n)

7.若是有兩個單詞的組成徹底相同,就稱爲同源單詞.例如stop和post.如今有一個字典,若是找出其中全部的同源單詞?

想到了trie樹.假設都是小寫字母的話,那麼就構造一個26叉樹表明26個小寫字母.在將單詞存入樹中時,將它拆爲按字典序排好的字母,例如stop就是頭結點->o->p->s->t,而後將stop存入t結點中.相似的post也會被存在頭結點->o->p->s->t結點中.這樣遍歷一次字典後只須要看樹結點中有沒有多個單詞就能找到所有同源單詞了.

面試官問若是一個單詞很長的話怎麼辦,回答能夠用哈希表存儲每一個字母的出現次數.可是這種方法適合用於判斷兩個單詞是否是同源單詞,不適合查找全部同源單詞.

網上一種思路是先按字母數量排序,而後再存入字典樹,比較快速.

8.k-means的原理

9.k-means是局部最優仍是全局最優,爲何

局部最優.緣由我回答的是由於k-means的最終結果和初始點的選取有關,因此不多是全局最優的.

面試官表示應該從凸函數的角度去解釋.另外在網上看到一種說法是k-means是貪心算法的一種實現,因此是局部最優.

10.項目經歷

11.有2.5億個數字,要從中找出全部只出現過一次的數字,如何實現

首先利用哈希表將2.5億個數字劃分紅1000個小文件.而後對於每一個小文件,採用bitmap的思想.所謂bitmap就是指用位來代替數字,本題數字可能有沒出現過,出現過一次,出現過屢次三種狀況,因此要用2位來表示一個數字.在完成全部文件的bitmap後,00表示沒有出現過,01表示出現過一次,10表示出現過屢次,那麼咱們將1000個文件中每組對應的兩位bitmap相加,若是一組結果爲01就表示對應的數字只出現過一次.

offer流程:

過了一個週末後接到了部門經理的電話,給了口頭offer

兩天後接到HR電話,商量了入職時間.

又一週後收到了正式offer~

找算法崗實習的一些經驗:

  1. 對你想作的方向(好比機器學習/計算機視覺/天然語言處理/深度學習)的經常使用算法的數學原理和編程實現要深刻了解,極可能會被問到公式推導或者底層實現之類的細節.例如我是機器學習方向的,那麼就要着重瞭解svm\決策樹\nb\lr\knn\k-means這些算法,以及相關的損失函數和各類優化方法.推薦的書籍是《統計學習方法》
  2. 計算機專業的幾門大課(計組,計網,操做系統,數據結構)儘量掌握得紮實一點,其中對算法崗來講最重要的是數據結構與算法,推薦在leetcode或者相似的平臺刷題,不用貪多,重要的是掌握幾種經常使用數據結構和算法(數組,樹,dfs,bfs,動態規劃,哈希表)的應用場景.另一定要了解經常使用數據結構操做和算法的時間複雜度.
  3. 算法崗和大數據是分不開的,面試中的最後一題極可能是關於處理海量數據的.能夠參考教你如何迅速秒殺99%的海量數據處理面試題
  4. 對於經常使用的語言(c++,java,python中的一門或多門)要深刻了解,不能侷限於實現簡單的代碼邏輯.以python爲例,要知道列表生成式\各類內置數據結構的原理\map函數\深淺拷貝這些知識.
  5. 會用一些相關的框架或庫,例如數據處理的numpy和pandas,機器學習的sklearn和xgboost,深度學習的tensorflow/pytorch/keras等等.
  6. 最好有一些相關的競賽(Kaggle,天池)或項目經歷,既能夠鍛鍊本身的工程能力,也會讓面試的時候有本身擅長的東西可講,不然就會被問到不少基礎方面的問題.
相關文章
相關標籤/搜索