2018年春招實習面試經驗總結

本文轉自我的個人網站:http://cuijiahua.com/

一、前言

最近一直在參加各種面試,感覺自己面試表現很弱雞,雖然已經有了點offer,但跟那些offer收割機比起來,差得太遠。本篇文章記錄了自己在面試過程中被問到的各種問題以及一些經驗之談。對於後續碰到的一些面試題,我會在個人網站持續更新持續更新。點擊查看

我選擇崗位的標準是,找各個公司最適合我的實習崗位,有就投,沒有就pass,因此我投遞的崗位有些多樣,主要投遞的崗位:算法工程師、機器學習/深度學習工程師、數據挖掘工程師。

參加過的面試形式有:電話面、視頻面、現場面。

對了,找面試期間,如果你的來電標有房產中介之類標識,也要接起來,不要直接掛斷,因爲沒準這就是你面試官的副業(尷尬臉)。

二、經驗總結

參加面試各種不順,深感自己的弱項在於數據結構掌握不行,劍指offer刷了一遍,怎奈腦子不夠用,總是忘記,還需繼續努力纔是。

剛開始面試的時候,遇到了各種問題,也辦了一些傻事。此處總結下,說下自己的感受:

1、認真思考

剛開始參加面試的時候,很不自信。遠程電話面試的時候,面對面試官的一個問題,我的第一反應是這個問題在哪看過,網上是怎麼說的,甚至是在哪能找到答案。當時的我忽略了思考這個問題本身,而去想從何處能找到所謂的正確答案,自己的這一問題是準備不充分、不自信、緊張共同造成的結果。其實,如果認真的思考問題本身,答案並不難想到,而我往往是撂下電話,自己認真思考一下,然後悔恨不已:哇,剛纔怎麼沒有想到!所以一句話:面對面試官的問題,一定要自己認真思考問題本身,自信一些,說出自己的想法,如果碰到耐心的面試官,他會一步一步引導你的。

2、做好準備

剛開始我是“佛系”面試,一切隨緣,真的一點不準備,也不知道自己應該看啥,然後面試了還蒙逼,明明有些不自信,還這麼浪,可想而知,面試結果也很慘,二連跪,三連跪,跪得我都快站不起來了。當然,如果是真大牛,“佛系”面試也可以,怎奈我是一個渣碩,準備還是需要好好做的,因此決定痛改前非,重新做人。經過一段時間的準備,終於有些思路了,我認爲需要着重準備以下幾點:自我介紹、數據結構、簡歷項目、崗位需求。

  • 自我介紹:這個是最好準備的東西了,根據自己的實際經歷,組織好語言即可。有些面試官會問,或者剛開始面試的時候,面試官正在看你簡歷時,你可以主動提:那我先做下簡單的自我介紹吧。
  • 數據結構:數據結構不是說我刷過劍指offer就算準備好了,應該在面試之前,把常規的數據結構題目過一遍,比如八大排序算法默寫一遍,不要在IDE裏調試着寫,在紙上寫或者在文本編輯器中寫。因爲面試讓你寫的時候,就是如此。個人感覺,面試的時候,在線編程出的題不會很難,無非就是字符串類型、數組類型、二叉樹類型、堆棧類型、鏈表類型,把這幾種常見類型題都過一遍,比如兩個單鏈表如何判斷是否相交、知道有相交怎麼找到這個交點諸如此類的問題,都自己寫一遍。剩下的拔高題可以適當看一下,然後就是臨場發揮和積累了。
  • 簡歷項目:面試官問的一些問題往往都是針對項目經歷問的,比如我寫了基於嵌入式平臺的目標檢測系統,那麼面試官就會問yolo、ssd原理可以說一下嗎?yolo v2做出了哪些改進?針對自己簡歷上寫的項目,好好想一想可能出哪些問題?自問自答走一波。
  • 崗位需求:這個就需要我們針對崗位要求進行準備了,比如對於深度學習崗位,會問下神經網絡基礎,卷積核是怎麼計算的?卷積層、全連階層都有什麼作用?你會用哪些深度學習框架,可以簡述下使用流程嗎?你認爲深度學習和傳統機器學習本質上有什麼不同?對於這些問題,我們都可以提前準備,面試前一個小時,好好過一遍,會有意想不到的收穫的。

3、時刻準備

有些公司電話說不定什麼時候就打進來了,可能投遞簡歷半個月了,你都忘記了。本以爲是直接約個面試時間,結果上來直接面試。當然此時,可以說下自己現在不方便,可不可以另約時間。但是心裏總會有疑慮:哇,這樣到時候他會不會忘了?人到時候滿了,自己進不去了?諸如此類的想法。其實,大多時候是沒有問題的,不必有這些想法。不過,也不排除罕見的個別情況。所以,爲了完全避免這些憂慮,時刻做好面試準備,保持電話時刻暢通是很有必要的。

4、儘量內推

內推很重要,如果沒有內推,那麼需要走簡歷篩選流程,就是HR從簡歷池把你的簡歷撈出來,如果沒有撈出來,也就是沒有相中你的簡歷,很可能你連個面試機會都沒有,直接把你bass了。但是如果有內推,就會好很多。而且內推可以走提前批,大廠都有這些流程,意思就是不用等後面的統一筆試,直接面試。從哪找內推呢?

  • 通過師兄、師姐;
  • 有的公司沒有師兄師姐在怎麼辦?可以通過各個QQ羣,比如一些春招內推羣、秋招內推羣;也可以通過各大學校的BBS,對於外校不能訪問的BBS,例如北郵人,可以找同學借帳號,或者通過鏡像站進入;還有就是公衆號了,現在好多公衆號都在做這個方面的東西,比如:校招導師、校招日曆、內推軍等。校招導師不用發朋友圈廣告就能獲得內推郵箱,其他需要轉發,自行斟酌吧。
  • 最後就是一些學習羣,比如機器學習相關的大羣,偶爾也會有一些內推信息。

5、不要着急

這一點我感覺也很重要,別上來就投BAT大廠的崗位,先試試其他公司,試試水。不過話又說回來,其實一些初創公司反而面試可能會更難,因爲BAT這些大廠出題都是有跡可循,而一些初創公司說不定考你什麼題,並且可能崗位要求比大廠還高。

值得注意的一點是,如果對於部門不瞭解,一定要好好了解一番,不要急着投遞簡歷,諮詢諮詢別人,選擇部門也是一門學問。

同時,比如一些筆試,如果沒有信心,可以等一等,等第一波人做完了,諮詢一下,至少什麼類型的題你是能知道的。

6、博客、Github沒那麼重要

曾經以爲有個好的博客,牛的Github項目,就能有一些加分。現在發現,這個就要看面試官怎麼看了,面試官感覺好,就有用。如果面試官感覺沒用,那就作用不大。

個人感覺,這些東西只能算作一塊好看一點的敲門磚。如果把沒有這些的簡歷比作一個沒用使用美顏和濾鏡的攝像機拍下的磚頭,那麼有這些東西的簡歷就是開了美顏和濾鏡的磨了皮的磚頭。好看了一點,但是面試的時候,還是要看你的本質,需要好好準備內功纔是。

儘管用處不是很多,我依然很喜歡做這些工作。因爲我一直感覺自己腦子不夠用,需要靠這些筆記回顧自己所學。別人看過的東西,等到用到的時候可以第一時間想起來;但是我有時候真的想不起來,但是我可以想起我在哪寫過,我可以第一時間找到這篇自己寫的文章,並且迅速回顧,然後用起來。所以,天賦不同,註定我要靠這種方式去彌補自己的不足。

除此之外,我感覺另一個好處就是,會有一些人主動聯繫你,幫你內推吧。當然,後續的面試情況還是要看你自己的。

7、運氣也很重要

感覺面試也很看運氣,與其說是運氣,不如說是面試技巧。感覺這個挺玄學的,不過它確實存在,你跟面試官很match,問的題目剛好是自己都會的,那麼恭喜,這輪面試你就輕鬆過去了。不能否認運氣的存在,更不能全靠運氣,自身實力過硬,一切OK。

三、問題彙總

我遇到的問題,總共可分爲六類:計算機基礎、數據結構、機器學習相關、深度學習相關、項目相關、業務場景。

項目相關是根據個人簡歷問的,每個人的項目經歷都不同,只需要根據事情闡述即可,此文不做記錄,本文主要記錄另外五類問題。

1、計算機基礎

對於我找的方向來說,一般都會問一些linux基礎,比如常用linux指令,這個如果平時經常用linux的話,問題不大。如果沒有這方面基礎的,就需要提前學一學了。還有就是會問一下關於你熟悉的計算機語言的基礎知識,比如我說我更熟悉python,那麼面試官可能就會問一些關於python基礎的問題。

總結下我曾被問到的相關問題:

1、進程和線程的區別?

答:進程擁有一個完整的虛擬地址空間,不依賴於線程而獨立存在;反之,線程是進程的一部分,沒有自己的地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。

比如:開個QQ,開了一個進程;開了迅雷,開了一個進程。在QQ的這個進程裏,傳輸文字開一個線程、傳輸語音開了一個線程、彈出對話框又開了一個線程。所以運行某個軟件,相當於開了一個進程。在這個軟件運行的過程裏(在這個進程裏),多個工作支撐的完成QQ的運行,那麼這“多個工作”分別有一個線程。所以一個進程管着多個線程。通俗的講:“進程是爹媽,管着衆多的線程兒子”。

參考自:https://www.zhihu.com/question/25532384

2、爲什麼說python的線程是僞線程?

答:在python的原始解釋器CPython中存在着GIL(Global Interpreter Lock,全局解釋器鎖),因此在解釋執行python代碼時,會產生互斥鎖來限制線程對共享資源的訪問,直到解釋器遇到I/O操作或者操作次數達到一定數目時纔會釋放GIL。

所以,雖然CPython的線程庫直接封裝了系統的原生線程,但CPython整體作爲一個進程,同一時間只會有一個線程在跑,其他線程則處於等待狀態。這就造成了即使在多核CPU中,多線程也只是做着分時切換而已。

參考自:https://www.zhihu.com/question/23474039

3、python的append和extend有什麼區別?

答:extend()接受一個列表參數,把參數列表的元素添加到列表的尾部,append()接受一個對象參數,把對象添加到列表的尾部。

例如:

a = [1,2]
b = [1,2,3]
a.append(b)
print(a)

輸出結果爲:

[1, 2, [1, 2, 3]]

而:

a = [1,2]
b = [1,2,3]
a.extend(b)
print(a)

輸出結果爲:

[1, 2, 1, 2, 3]

4、linux下創建定時任務使用什麼指令?

答:可以使用crontab命令。

2、數據結構

個人感覺數據結構最重要,面試過一些公司,五花八門什麼題都有,但是唯一統一,都考的就是數據結構基礎了。但是考法不同,區別在於有的讓說思路,有的讓在線寫代碼。

私以爲,複習的方法應該是:審題->思考->表達->碼字。

首先,審題很重要無需廢話,拿到題目,我們需要認真思考一番。然後就需要組織語言,把自己所想表達清楚。別小看這一個步驟,組織語言表達清楚很重要。一些公司都是先讓說思路,再讓寫代碼的,甚至是隻說思路。所以,在複習的時候,把每道題的思路想清楚,說明白很重要。最後,我們再將自己的想法寫成代碼。

其實,這部分的數據結構基礎題,只要《劍指Offer系列刷題筆記彙總》這些題目都掌握好,就足以應付,不會出太難的題目難爲人,都是常規題。

下面對一些常見題型進行彙總,這些也是我面試時,真實被問到的題以及相關擴展題。

鏈表:

1、找出單鏈表的倒數第K個元素(僅允許遍歷一遍鏈表)

答:使用指針追趕的方法,定義一個fast指針和一個slow指針,fast指針先走K步,然後fast和slow同時繼續走。當fast指針走到鏈表尾部時,slow指向的位置就是倒數第K個元素。注意:要考慮鏈表長度應該大於K。參考:劍指Offer(十四):鏈表中倒數第k個結點

2、找出單鏈表的中間元素(僅允許遍歷一遍鏈表)

答:使用指針追趕的方法,定義一個fast指針和一個slow指針,兩個指針同時走,fast指針每次走兩步,slow指針每次走一步。當fast指針到鏈表尾部時,slow指針指向的就是鏈表的中間元素。

3、判斷單鏈表是否有環?

答:使用指針追趕的方法,定義一個fast指針和一個slow指針,兩個指針同時走,fast指針每次走兩步,slow指針每次走一步。如果有環,則兩者會相遇;如果沒有環,fast指針會遇到NULL退出。

4、已知單鏈表有環,如何知道環的長度?

答:使用指針追趕的方法,定義一個fast指針和一個slow指針,兩個指針同時走,fast指針每次走兩步,slow指針每次走一步,找到碰撞點。然後使用slow指針,從該碰撞點開始遍歷,繞着走一起圈,再次回到該點,所走過的結點數就是環的長度。

5、如何找到環的入口結點?

答:先使用題4的方法,計算出環的長度。然後重新從頭結點開始遍歷,定義定義一個fast指針和一個slow指針,fast指針先走l(環的長度)步,然後兩個指針以相同的速度在鏈表上向前移動,直到它們再次相遇,那麼這個相遇點即爲環的入口結點。參考:劍指Offer(五十五):鏈表中環的入口結點

6、判斷兩個無環單鏈表是否相交?

答:一旦兩個鏈表相交,那麼兩個鏈表從相交節點開始到尾節點一定都是相同的節點。所以,如果他們相交的話,那麼他們最後的一個節點一定是相同的,因此分別遍歷到兩個鏈表的尾部,然後判斷他們是否相同。

7、如何知道兩個單鏈表(可能有環)是否相交?

答:根據兩個鏈表是否有環來分別處理,若相交這個環屬於兩個鏈表共有

(1)如果兩個鏈表都沒有環,如題6所示方法。

(2)一個有環,一個沒環,肯定不相交。

(3)兩個都有環。在A鏈表上,使用指針追趕的方法,找到兩個指針碰撞點,之後判斷碰撞點是否在B鏈表上。如果在,則相交。

8、尋找兩個相交鏈表的第一個公共結點。

答:我們也可以先讓把長的鏈表的頭砍掉,讓兩個鏈表長度相同,這樣,同時遍歷也能找到公共結點。此時,時間複雜度O(m+n),空間複雜度爲O(MAX(m,n))。參考:劍指Offer(三十六):兩個鏈表的第一個公共結點

9、反轉鏈表。

答:我們使用三個指針,分別指向當前遍歷到的結點、它的前一個結點以及後一個結點。在遍歷的時候,交換當前結點的尾結點和前一個結點的。參考:劍指Offer(十五):反轉鏈表指

數組:

1、給定一個數組(非遞減排序),同時給定一個目標數字,找出這個數字在該數組中第一次出現的位置,如果不存在,返回-1。例如[1,3,5,5,5,5,8,9,13,15],輸入5,返回2,輸入8,返回6,輸入18,返回-1。

答:使用二分查找法即可。

# -*-coding:utf-8 -*-
def BinarySearch(input_list, end, value):
    if end == 0 or value < input_list[0] or value > input_list[-1]:
        return -1
    left = 0
    right = end - 1
    while left <= right:
        middle = left + (right - left) // 2
        if input_list[middle] >= value:
            right = middle - 1
        else:
            left = middle + 1

    return left if left < end else -1

if __name__ == '__main__':
    input_list = [1,3,5,5,5,5,8,9,13,15]
    target = 5
    print(BinarySearch(input_list, len(input_list), target))

運行結果如下圖所示:

這裏寫圖片描述

2、給定一個數組,裏面有很多數字(亂序),找出其中最大的4個數字。

答:最簡單的辦法就是先排序再找出最大的四數,這種方法時間複雜度過高。一個更好的方法是使用堆排序,即維護一個存儲最大的4個數的最大堆。

解析:這的思想和代碼可以參考《劍指Offer(二十九):最小的K個數》,這裏僅僅做了一個變形。

3、給定一個整數的數組nums,返回相加爲target的兩個數字的索引值。假設每次輸入都只有一個答案,並且不會使用同一個元素兩次。

答:如果這個數組是已經排序的,可以使用頭指針和爲指針。如果是已經排序的,那麼我們可以定義一個頭指針left,一個爲指針right。left指針指向元素值+right指針指向元素值的和爲sum,用sum和target比較。如果sum大於target,說明和大了,那麼right右指針左移一位,然後重新判斷。反之,如果sum 小於target,說明和小了,那麼left左指針右移以爲,然後會從新判斷。直到找到sum=target的情況。如果沒有排序,可以使用使用哈希表,也就是散列表。

解析:如果沒有排序,這道題就是Leetcode中的一道題。代碼可以參考《Two Sum》。

4、給定一個字符串,找到最長無重複子字符串。

答:定義兩個變量longest和left,longest用於存儲最長子字符串的長度,left存儲無重複子串左邊的起始位置。然後創建一個哈希表,遍歷整個字符串,如果字符串沒有在哈希表中出現,說明沒有遇到過該字符,則此時計算最長無重複子串,當哈希表中的值小於left,說明left位置更新了,需要重新計算最長無重複子串。每次在哈希表中將當前字符串對應的賦值加1。

解析:Leetcode中的一道題。代碼可以參考《Longest Substring Without Repeating Characters》。

其他:

1、不使用現成的開根號庫函數,如何實現開平方根的操作?

答:可以使用二分查找法或者牛頓法。

# -*-coding:utf-8 -*-
def sqrt_binary_search(target):
    left = 0
    right = target
    mid = (left + right) / 2

    while abs(mid*mid-target) > 0.000001:
        if mid*mid == target:
            return mid
        elif mid*mid > target:
            right = mid
        else:
            left = mid
        mid = (left + right) / 2
    return mid

def sqrt_newton(target):
    k = target
    while abs(k*k-target) > 0.000001:
        k = 0.5*(k+target/k)
    return k

if __name__ == '__main__':
    print("二分查找法:",sqrt_binary_search(64))
    print("牛頓法:",sqrt_newton(64))

運行結果如下圖所示:

這裏寫圖片描述

3、機器學習

1、什麼是歸一化,歸一化的作用是什麼?

答:歸一化是將數據變爲(0,1)之間的小數,主要是爲了數據處理方便,把數據映射到0~1範圍之內處理,處理起來可以更加便捷快速。歸一化的作用是把有量綱表達式變爲無量綱表達式,歸一化是一種簡化計算的方式,即將有量綱的表達式,經過變化,化爲無量綱的表達式,成爲純量。同時,提高迭代求解的收斂速度,提高迭代求解的精度。

相應擴展:

深度學習中的歸一化應該怎麼理解?

答:神經網絡學習過程的本質是爲了學習數據分佈,一旦訓練數據與測試數據的分佈不同,那麼網絡的泛化能力也大大降低;另一方面,一旦每批訓練數據的分佈各不相同,那麼網絡就要在每次迭代都去學習適應不同的分佈,這樣會大大降低網絡的訓練速度,這也正是爲什麼我們需要對數據進行歸一化處理的原因。對於深度網絡的訓練是一個複雜的過程,只要網絡的前面幾層發生微小的改變,那麼後面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分佈發生改變,那麼這一層網絡就需要去適應學習這個新的數據分佈,所以如果訓練過程中,訓練數據的分佈一直在發生變化,那麼將會影響網絡的訓練速度。因此,我們一般會對輸入數據進行”白化”除理,使得它的均值是0,方差是1。

2、標準化是什麼?

答:數據的標準化是將數據按比例縮放,使之落入一個小的特定區間。由於信用指標體系的各個指標度量單位是不同的,爲了能夠將指標參與評價計算,需要對指標進行規範化處理,通過函數變化將其數值映射到某個數值區間。

相應擴展:

常見的數據歸一化方法有哪些?

答:min-max標準化、z-score標準化等。

對於數據標準化/歸一化的詳細內容,可以參見:http://blog.csdn.net/pipisorry/article/details/52247379

3、你最熟悉的機器學習算法是什麼?可以講解下SVM原理嗎?

答:省略若干字。

解析:這部分內容可以參考我的文章《機器學習實戰教程(八):支持向量機原理篇之手撕線性SVM》,我當時面試的時候是先說的線性可分的情況,然後再引入核函數。

4、在推導公式的時候,爲要向量化,這是什麼意思?

答:其實就是將多組數據,放到一個矩陣裏,進行矩陣運算。因爲如果是一條一條遍歷計算參數,需要用到for循環,這樣很浪費時間。python的第三方庫提供了很好的矩陣計算支持,我們完全可以把多組數據放到一個矩陣裏,這樣可以實現多組數據同時計算。這個向量化推導,就是根據一條數據計算公式推導出矩陣運算公式,這樣可以方便我們寫代碼。

5、在邏輯迴歸中,我們使用的是sigmoid函數,知道sigmoid函數吧?

答:知道。

繼續問:那麼tanh函數和它有什麼區別呢?

答:它們的值域不同,sigmoid函數將輸出映射到0~1的範圍內,而tanh函數將輸出映射到-1~1的範圍內。同時,它們過零點的值也不同,sigmoid函數的過零點的值爲0.5,tanh函數過零點的值爲0。當我們更偏向於當激活函數的輸入是0時,輸出也是0的函數時候,就需要使用tanh函數,而非sigmoid函數。

4、深度學習

目標檢測算法相關:

1、簡述下YOLO算法原理?

答:Yolo算法採用一個單獨的CNN模型實現end-to-end的目標檢測,模型參考自GoogleNet,YOLO的CNN網絡將輸入的圖片分割成SxS的網絡,然後每個單元格負責去檢測那些中心點落在該格子內的目標。每個單元格會預測B個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的準確度,邊界框的準確度可以用預測框與實際框(ground truth)的IOU(intersection over union,交併比)來表徵。邊界框的大小與位置可以用4個值來表徵:(x,y,w,h),其中(x,y)是邊界框的中心座標,而(w,h)是邊界框的寬與高。還有一點要注意,中心座標的預測值(x,y)是相對於每個單元格左上角座標點的偏移值,並且單位是相對於單元格大小的,而(w,h)預測值是相對於整個圖片的寬與高的比例。這樣,每個邊界框的預測值實際上包含5個元素:(x,y,w,h,c),其中前4個表徵邊界框的大小與位置,而最後一個值是置信度。每個單元格需要預測 (B*5+C) 個值。如果將輸入圖片劃分爲 S*S 網格,那麼最終預測值爲 S*S*(B*5+C) 大小的張量。對於PASCAL VOC數據,其共有20個類別,如果使用 S=7,B=2 ,那麼最終的預測結果就是 7*7*30大小的張量。

解析:不用慌,只要自己思路清晰,說的連貫,不間斷卡殼就行,其實如果面試官不瞭解這些,他也是聽不懂的,但是最好不要瞎說,因爲他也會查的,並且可能會抓住其中一點,深入細問,如果問的正好是你瞎編的內容,你就無法自圓其說了。

2、相對於YOLO,YOLO v2有哪些改進?

  • 首先,將dropout層去掉,在每個卷積層添加了Batch Normalization,mAP提高了2%;
  • 其次,使用高分辨率分類器,將輸入分辨率數據有224*224變爲448*448,mAP提高了4%;
  • 第三,引入anchor boxes來預測bounding boxes,去掉網絡中的全連接層。準確率只有小幅度的下降,而召回率則提升了7%,說明可以通過進一步的工作來加強準確率,的確有改進空間;
  • 第四,使用維度聚類,本文使用K-means聚類方法訓練bounding boxes,可以自行找到更好的boxes寬高維度;同時使用直接位置預測(Direct lacation prediction),將定位預測值歸一化,使參數更容易得到學習,模型更加穩定。作者使用Dimension Clusters和Direct location prediction這兩項anchor boxes改進方法,mAP獲得了5%的提升。
  • 第五,增加細粒度特徵(Fine-Grained Feature),是模型獲得多尺度的適應性,簡單添加了一個轉移層( passthrough layer),這一層要把淺層特徵圖(分辨率爲26 * 26,是底層分辨率4倍)連接到深層特徵圖。這樣做相當於做了一次特徵融合,有利於檢測小目標。

3、深度學習方法與傳統機器學習方法的區別是什麼?

答:機器學習包括深度學習,深度學習是使用卷積層學習特徵,而非像機器學習那樣需要人爲提取特徵,深度學習可以自行學習到更深層次的特徵。機器學習方法的各個公式有數學理論推導支持,深度學習方法就像一個黑匣子,缺少數學理論支持。

5、業務場景

這種題目也是常出題目,會給定你一個場景來提問。

1、如果給了你很多數據,這些數據已經標註好,即已經做好分類,現在讓你訓練出一個模型,用於區分新來的數據屬於哪一類,你需要怎麼做呢?可以說下詳細的流程嗎?

答:首先這是一個分類問題,首先應該想到的是可以嘗試使用常用的分類算法,例如樸素貝葉斯、決策樹或者SVM。拿到數據之後,做的第一件事就是特徵工程。然後將數據分類兩部分,一部分用於訓練,另一部分用於測試,即分爲訓練集和測試集,不混用。其實,使用什麼分類算法倒是其次,重要在於選好特徵,對於給定的特徵,需要做一些過濾,比如一些干擾數據,如果對於結果影響很大,可以嘗試捨棄這些數據。除此之外,看看是否需要對數據進行歸一化處理,將數據無量綱化。然後對已經處理好的特徵,送入分類算法中,讓其學習。最後,可以通過查看測試集的預測準確度,對一些算法必要參數進行優化調試。

解析:我當時差不多就是這麼回答的,我感覺只要說的,讓面試官認爲你做過相關工作即可。

2、如果給你1億個數據,讓你找出其中第1000大的數據,你會怎麼做?我們先不考慮多進程和多線程,也不考慮數據庫,如何在算法方面給出思路呢?

答:可以使用堆排序,創建一個存儲1000個數據的小根堆。先將1億個數據的前1000個數據放入這個小根堆中,然後繼續遍歷,對於新插入的數據,需要與小根堆的最小值進行比較,如果待插入的數據比這個最小值還小,那麼不插入,如果比這個最小值大,那麼就插入該數,並重新調整小根堆,隨後繼續使用此方法遍歷整個數據。遍歷一次數據後,就得到了前1000大的數據,然後輸出小根堆的最小值,即根值,即可得到第1000大的數據。

解析:這道題當時能想到的就是用堆實現了,其他更好的方法歡迎探討。

四、總結

  • 有的題目已經忘記了,記不清了就暫不記錄了,本文會根據後續面試進行持續更新。
  • 本文中的一些問題並不一定是標準答案,只是自己的一點小認識;
  • 本文中提到的問題並不是一場面試的題目,而是很多公司面試題目的集合;
  • 在線編程題出的題目不會太難,本文提到的題目都是現場提問的;
  • 自己認真、限時寫出編程基礎題很重要,要多多練習,自己練習的時候可能沒有問題,但是當現場面試的時候,如果不熟悉,往往會很慌,反而寫不出來了。
  • 如有錯誤或更好的見解,歡迎指正討論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章