1. 程式人生 > 其它 >從大學混子,到國企20K的越級選手,我的python面試經歷你想看嗎(可免費下載)

從大學混子,到國企20K的越級選手,我的python面試經歷你想看嗎(可免費下載)

我的簡介
96年生,18年畢業,雙非院校,通訊工程非計算機科班出身。少時貪玩,大學混到了大四的上學期,有個嚴格的老師,說曠課一次就沒有平時分,我不得不去聽《行動通訊》這門課,被迫做課堂作業。大四春招,這門課居然起到了作用,我成功拿到了一家央企研究所民營方向子公司的offer,但因為學歷原因,也只是去做一名一線員工(移動運營商的日常網路優化工作)。畢業後簽了合同,立馬被派去一個五線中都排名靠後的小城市,生活壓力低,領著3700的實習工資,還很愜意。2020疫情襲來,打破了我安逸的生活,公司各專案因為疫情原因都急缺人手,我被領導安排去一個省會城市工作,然而這時候的我工資才只有6k。這也是我畢業後工作了一年半的時間點,那些考研的老同學玩伴大多開始了大廠的實習,在他們每天的朋友圈動態的刺激中,我逐漸明白當初的玩伴中,只有我一直在墮落。趁著在家休息的日子,我開始逐步考慮究竟是通訊行業考研還是轉行。拿出半年多空窗期作為賭注的我,開啟了我的Python學習之路。
半年後,經過一系列的理論和實戰輪番轟炸之後,我便開始了面試。第一週,我全部落敗,第二週我重新整理思路,用一週時間給我的筆記做思維導圖。一個月內我拿到了兩家世界500強外企的offer,一家網安行業老二的offer,還有“體面廠”和“良心想”的口頭offer。最終我選擇了一家500強外企,一個18k(試用期80%),原因是它不加班。哈哈。。。

面試總結
收到在這家國企電話一面,和往常的電話面試一樣,但是這個電話面試官好像很忙,而且也沒有讓我做自我介紹,上來直接來面我,也不問工程實踐的內容,也不問有沒有做過專案,估計就看一下簡歷就瞭解個大概了,就是一頓面問題,語速也是很快,不過問題問的非常清楚,如果你解釋的不對,他會問你是不是沒有聽清楚我的問題,但是好像並不是專業的面試官,面試的時候還在聽到他快速敲擊鍵盤的啪啪聲,好像是一邊工作,一邊順便面試我,我就想機會來了,這樣的面試通常是比較好的,但是他顯然沒做準備,時常出現我回答了一個問題之後,他還沒想到下一個問題問我,接著是一兩分鐘的沉默,然後再問下一個問題。不過問的問題很專業,很多都不是在面經裡面能刷到的,總結一下吧,說好要總結所有的面試題的。

1,平時都用哪些語言?

答:平時用 C++ 多一點,python 也瞭解,但不是很深入,基本上都是直接調的函式和相應的庫,並沒有研究它底部到底是怎麼實現的,意思就是沒看過 python 原始碼,你就問我 C++ 吧。(果然他開始問 C++,所以他這樣問肯定是想問你最擅長的語言)

2,你有用過 STL , boost 這些庫嗎?

答:用過 STL,最近在看侯捷老師的 STL 原始碼剖析。

3,STL 都有哪幾個組成部分?

答:容器,介面卡,迭代器,演算法,然後就知道還有一個,現在想想肯定是由於當時有點緊張,就沒答出來,還是看過原始碼的人呢,這都答不出來,丟人,他還給提示說加括號那個,妹的,我竟然說是運算子過載,(我以為是()過載,這和 STL 有什麼關係,這都能說出來,呸呸呸。。。),他最後說還有 仿函式,心想這個和 括號有什麼關係,後來想想確實是有關係,一般用到仿函式的時候都會在後面加個括號,表示這是一個匿名物件,這樣進行使用,看來應了那句話:瞭解不行,知道也不行,必須形成條件反射才行。

4,問我 STL 你都有用過哪些容器?

答:很隨意的說用過 array,vector(這個用的比較多),set,map,hash_map,hash_set,然後他似乎聽得出來了,然後就問我 STL 裡面就直接叫 hash_map 嗎?哈哈,此刻確定他在聽我講話,然後立即改口說,不是,叫 unordered_map,unordered_set。

5,set 底層是怎麼實現的 ?

答:用紅黑樹來實現的,我以為他會問我具體的紅黑樹知識,比如插入,刪除,調整,結果啥都沒問,就直接過了。嚇了一身汗。。。

6,unordered_map 的底部是怎麼實現的?

答:用 hash_table 來實現的 。

7,查詢的時間複雜度是多少?

答:定位一個槽 是 O(1),如果定位一個元素,用外部拉鍊法的話,平均查詢長度是連結串列的長度的一半,時間複雜度為 O(n)。

8,估計是聽到外部拉鍊法,就直接問有沒有其他的處理衝突的方式?

答:二次定址法,雙雜湊法

9,如果我要實現一個hash_map,鍵為 字串(string),那該如何設計?

答:我說:直接把對應的鍵值對存到每個槽對應連結串列節點中就行了,他說:我不是這個意思,就是你定位槽的時候不是需要取模運算嗎,那 string 怎麼取模呢?我說:需要把這個字串轉換為對應的Hash Code,然後說 STL 中是這樣實現的,就是直接用 i * 5 + j 這個公式直接求該字串的 hashCode 值【注:看原始碼還是有用的】。

10,他說用 C++ 記憶體洩漏這個問題還挺麻煩的,如果你的程式發生了記憶體洩漏,你怎麼才能檢測到是在哪發生了記憶體洩漏了呢?

答:可以用記憶體洩漏的分析工具來分析,他問:比如哪些工具?答:其實我是忘記了,記得嵌入式 Linux 課有一個實驗讓用 這個工具,而且也看到過相應的部落格,所以 Val …g…,我說忘記怎麼讀了,他知道我瞭解這個工具,就直接告訴我了,叫 Valgrind。當然還有其它很多,答什麼都可以的。他問:還有什麼其它辦法嘛?確實想不起來了,他作罷。

作業系統:

11,然後好像沒什麼可問的了,就直接跳轉到 作業系統了,然後問 你會 linux 系統的使用嗎?

答:會一些基本命令,他問:比如都會哪些命令?答:ls ,cp,mv,cd 等等這些基本命令,他也就沒再問下去了。

12,現在說 系統是 64 位 還是 32 位是什麼意思?

答:是說 cpu 每次可以處理的資料 位數,應該沒啥毛病啊,莫不是 地址線是 64 條 ,還是資料線是 64 條???應該是回答的不好,他也就直接就沒再問了。

13,問 32 位系統下一個程序可分配的最大記憶體空間是多少?

答:這道題直接回答不上來,我記得記憶體最大是 4G,其中核心地址是最高的 1G 空間,其它的 3G 都是使用者態空間,這一個程序能分配多大還真是不知道,莫不是可以全用???然後覺得作業系統部分的內容掌握的不太好。。主要是整天用 windows ,要是用 Linux 應該知道吧。。

然後轉到計算機網路部分

14,你知道 UDP 和 TCP 有哪些不同嘛?

答:最主要的不同就是 TCP 是可靠傳輸,UDP 是不可靠傳輸,TCP需要建立連線,UDP 不需要,TCP 有擁塞控制,UDP 沒有。

15,因為話多,因為多說了一句:TCP 用來保證可靠傳輸的方法 UDP 都沒有,因為 UDP 是不可靠傳輸,然後他就問,都有哪些手段保證 TCP 可靠傳輸?

答:滑動視窗進行流量控制,超時重傳,ack 確認等。然後他就沒再問了。

轉到資料庫部分

16,你有用過哪些資料庫?

答:Mysql 用的比較多一些。

17,如果我有一個表比較大,我現在執行了一個 select 語句,發現執行的特別慢,我該怎麼解決?

答:這主要看這張表具體有多大,如果很大,有幾億行的話,那麼就需要考慮分表的問題,如果不是很大,不至於分表,那麼可以考慮是不是需要建索引,他問:還有別的辦法嗎?答:也許是你的select 語句寫的不合適,他問:我沒聽懂,什麼是不合適?答:也可能是索引已經建好了,可是你的 select 語句沒用到索引,或者是沒走索引。問:如何知道自己的 sql 語句走沒有索引?答:在自己的 sql 語句前面加 explain 就可以看到 sql 語句的具體執行過程。

18,你平時都是怎麼除錯程式的?

答:我主要是用 VS 寫程式碼,所以用斷點除錯用的比較多,也會用到 print 進行列印資訊來除錯。他問:如果用 print 的話,那資訊走的太快了,一閃而過怎麼辦?我說可以加斷點或者加延遲函式可以看到,現在想一下,VS 裡面最後不是一般加 system(“pause”),就可以停住了嘛,dev++ 什麼也不用加就自己停住了啊,怎麼會看不到 打印出來的資訊呢???不知道他想問啥。。

19,我寫了一個程式,發現 cup 的負載量達到了 100%,我程式中可能出現了一個死迴圈,我該怎麼找到這個死迴圈出現的地方呢?

答:可以用二分查詢的,定位出現死迴圈的地方,或者通過加斷點的方式來進行查詢死迴圈。他問:那找找也很慢啊,還有其他的方式嘛?我實在想不到了,他就此作罷。

20,現在我有 10000 個數,我想找到最大的 100個,怎麼找呢?(實用演算法課 PPT 上的原例)

答:可以用堆來做,問:怎麼做?答:先建立一個100個元素的小根堆,然後遍歷後面剩餘的元素,如果比堆頂的元素小,則直接跳過,如果比堆頂的元素大,則和當前堆頂元素進行交換,然後調整堆,最後剩餘的堆中的元素就是前100大的元素。

21,(坑人的來了)問你這個時間複雜度是多少?

答:建堆時間是 O(Nlog2N)[注:STL 中做了優化,可以達到線上性時間內完成建堆],然後對後面的元素進行遍歷,然後不斷調整堆,需要O(Nlog2N) 的時間複雜度。這不是原例嘛,但是他說那和快排的時間複雜度是一樣的話,為什麼不用快排呢?然後我就卡在這了。。。我答:可能是時間複雜度的常數項不一樣。他說:遍歷後面的N個元素是少不了的,O(N) 是少不了的,那個 O(log2N) 怎麼來的,我說每次調整堆都需要 O(log2N) 的時間複雜度啊,但是如果比堆頂元素小的話,直接跳過,就不用調整了。但是快排需要對所有元素進行排序。他說:時間複雜度就得考慮最壞情況下,最後實在不知道問題出在哪了???就此作罷,他說:你時間複雜度回答的不對。(回答不對直接告訴你,這個還挺人性化的)

22,然後就問你家是哪的?願意來深圳不?

答:你說該怎麼回答,肯定是願意啦。

23,然後問我有什麼問題?

答:隨便問了,比如主要做什麼工作?接觸什麼知識,做的工作能不能直接感受到?等等。。

意料之中的複試通知

1.首先做個自我介紹
2.自己做過的每個專案提一個問題,要求詳細具體闡述
3.Python的記憶體管理機制和垃圾清理機制
4.MySQL資料庫如何插入或修改一個欄位
5.Python2和Python3的區別
6.Python3是用什麼編碼的,Python3轉碼的函式
7.Nginx如何用一個IP部署伺服器
8.列舉列表和字典中的所有方法
9.如何利用js寫多執行緒
10.Django如何實現一個頁面的跳轉
11.socket程式設計有哪幾種方式,具體如何實現的
12.這裡有一支筆,請列舉這支筆的10種用途

可能因為一面問的問題比較詳細了,複試的問題就相對少一些。這裡我自己做個自我總結吧,整體問的問題真的不難,我就不一一解答了。不過,問題問的大多比較籠統,導致一個問題就是一定要有自己答題的邏輯性,不要因為面試緊張或者問的問題很寬泛而無從下手,亂了分寸。