筆試是兩道題,不是很難,給了70分鐘,大概30分鐘做完。每個測試樣例都能看做,暴力過的,不知道會不會隻是pretest
面試是兩面連着的,面試官說标準流程是前50分鐘做兩道題,後10分鐘其他。如果面試官對你履歷上的内容很感興趣,可能會打破正常。
說下面試題吧
一面面試官是男的,說對我的履歷内容很感興趣,是以先問了一下項目
題目:給定一些網頁的跳轉關系,例如A->B->F->D...,求從網頁X跳到網頁Y的最小次數
方法:就相當于求圖中的最短路,由于是無權重的,用BFS即可。
不要求運作,是以心理沒啥壓力,但是面試官是會一行一行review的
由于我履歷上有個epoll多路複用+線程池的項目,面試官要求我簡易實習一個工作隊列
這個題目非常有意思,畢竟自己的項目,多少還有點印象
初代
二代
我啪啦啪啦寫完了,面試官說互斥鎖和條件變量不需要初始化嗎?遂加上
三代
面試官說,如果一個job執行了很久,由于work_func沒有釋放鎖,其他線程并沒有執行,這樣多線程變成了單線程
啊這,确實如此
可以稍加改動,将執行函數提出來
最終
面試官逐行review,提出一個死鎖情況:當任務隊列為空時,work_func拿到了鎖,但是由于沒有就緒任務,會停在pthread_cond_wait,而新的任務又不能加入隊列,因為add沒法獲得鎖
我當時忘記pthread_cond_wait的用法了(後面會講,其實這麼寫不會死鎖),想了想,确實存在這種情況,隻能再改了
我将mutex的作用域改到最小,即隻用于隊列的互斥
其實并不會死鎖,我檢視了之前項目的寫法,寫的<code>pthread_cond_post(cond, m)</code>,其含義是:
pthread_cond_wait會先解除之前的pthread_mutex_lock鎖定的m,然後阻塞在等待對列裡休眠,直到再次被喚醒(大多數情況下是等待的條件成立而被喚醒,喚醒後,該程序會先鎖定先pthread_mutex_lock(&m);再讀取資源。
是以并不會死鎖,但是修改後的也不會死鎖啦
二面是個xjj,也沒說其他的,直接做題
發現是Leetcode原題。。。我是用hash統計單詞,再用hash統計hash。
xjj一直問我對單詞的hash可以優化嗎,char[26];
char[26]再用hash統計需要重寫hash函數吧??我說可以做進制編碼變成整數,她提示可以用string
貼一個面試時寫的巨醜的代碼:
點選檢視代碼
幾行代碼能寫完的東西,我寫出這樣的醜八怪,離譜!!
貼個養眼的:
題目:
Q2.
Minimize the distance to the farthest point
Assume you're looking to move, and have a set of amenities that you want to have easy access to from your new home.
You have found a neighborhood you like, each block of which has zero or more amenities.
How would you pick the block to live in such that the farthest distance to any amenity in your list is minimized?
Example:
Blocks = [
{restaurant, grocery}, // 2, 0 => 2
{theater}, // 1, 1 => 1
{school}, // 0, 2 => 2
{},
{school},
]
Requirements = {restaurant}
Requirements = {school, grocery}
大概就是,有n個街區,每個街區有一些地點,現給定一些地點,要你選擇一個街區,它到給定的那些地點的最大距離最小
方法:維護每個街區到每個地點的最小距離,從前往後和從後往前 都周遊一遍,然後枚舉每個街區,就能得到最終的最小值
我維護了所有的地點,面試官一直說可以不用維護這麼多,原來她指的是可以隻維護題目問的,我最後才弄明白她的意思...
不問八股文真的好爽,沒有那些亂七八糟的問題讓人自我懷疑
常數級的時間/空間優化也是必要的,在面試的時候,因為面試官通常也能看出來,不優化的話,我個人覺得印象分會降低
個性簽名:時間會解決一切