騰訊2013暑期實習筆試 面試總結

2021-09-08 09:28:29 字數 4002 閱讀 1957

接下來說說面試和筆試。

筆試其實挺無語的,和去年的題大量重合,我前一天剛好找了去年的題看,所以很多**題都答上了。當然,其實還是有3,4道題根本沒記住答案(但是知道是去年的題),所以就亂答的。附加題認真答了一道,另一道基本不會,隨便寫了幾行。後來在一面的時候看到自己卷子的分數是71,面試官跟我說分數還不錯,我無語ing……

一面:面試官態度都很好,一共兩個人。第乙個人主要問了大量簡歷上的內容,問的很細,很深。比如我獲過某個獎,那麼他就會問我做負責什麼部分,做的什麼東西,是怎麼做的。我的一段實習經歷他也很仔細的問了,基本上就是把我在那個公司做過的所有東西都介紹了,而且是細緻到在設計***演算法時設計和提取了***特徵,這個***特徵的具體是怎麼提取的,以及物理意義等。總的來說,就是把簡歷裡面能問的基本問了個遍。所以說,大家寫簡歷的時候,自己沒把握的最好別寫,因為有些面試官會問的很細,或者就挑那種你提了一句的東西使勁問,看你到底有沒有做過。簡歷大概問了半個小時,然後他說我們做幾道演算法題吧,給了我三道題和一疊紙,給我乙個小時做。題都不算難,不過要求程式設計實現,三道題分別是:

1.用最快的方法計算斐波那契數列

我覺得用o(n)非遞迴的方法就行,當然有o(log n)的更快方法,不過這個非遞迴挺難寫的(要是遞迴就達不到o(log n))。

注:有人提到了直接用公式

對此我進行了深入的調研,首先,這個公式裡面包含了兩個求冪算式,也就是說需要pow函式,那麼pow函式的原理是什麼呢?在vc裡面這個函式的源**是無法看到的,但是pow函式的原理還是可以查到的,因為在這裡n只取整數,那麼算乙個數的整數次冪,最快的方法也是o(log n),所以,這部分的運算的實際時間複雜度是o(log n),並不是所謂的o(1)。

空口無憑,我編了一小段程式來驗證自己的想法,定義了兩個求斐波那契數列的函式,其中fab1是用公式算,fab2用o(n)的方法計算。

void fab1(double

in);

void fab2(intin)

};int

main()

每次求n=50的值,迴圈取10000次和100000次,得到的結果如下:

迴圈10000次時,fab1平均時間在1.9微秒左右,fab2平均時間在2.5微秒左右

迴圈100000次時,fab1平均時間在18微秒左右,fab2平均時間在25微秒左右

所謂的o(1)時間複雜度無論如何也不可能和o(n)複雜度差距這麼小吧?因此,斐波那契數列的最低時間複雜度就是o(log n),另外,由於公式中的數字都是浮點型,如果使用整型的o(log n)演算法,理論上應該比這種公式法還要快。

2.給定整數sum,在亂序陣列中尋找所有滿足x+y=sum的組合並列印

這個很簡單,就是先排序,然後維護一頭一尾兩個指標,找到所有組合,時間複雜度o(nlog n+n)

這個也可以用雜湊做,時間複雜度o(n),不過資料的範圍不能太大。

3.在乙個超長陣列中尋找第k大數

這個不能用快排的partition做,因為陣列超長,所以暗含不能全部裝入記憶體中。我當時沒太理解題目,所以寫了那個用partition做的演算法,後來覺得有可能是考堆排序,又大致寫了堆排序那個演算法的思路:讀入前k個數並建立乙個大根堆,然後依次讀入陣列中剩下的數並調整堆,最後從堆中輸出最小的那個數就行,時間複雜度o(klog k+n)

第二個面試官看了我的**和思路之後,覺得大致沒問題,然後說我再考你兩道吧,說思路就行。

1.在2個排序好的陣列中找所有元素的第k大

我剛開始說直接呼叫一次歸併排序的merge就行,o(k)時間複雜度,面試官說讓我再想想,還有沒有更快的。然後我苦苦思索了5分鐘,想了一種o(log k)的,假設兩個陣列是降序排列,先比較兩個陣列的第k/2個數,如果相等,則這個數必為第k大的,如果不等,不妨假設a[k/2]2.找到1-10000以內的所有質數

如果之前沒有接觸過演算法的,這道題還是有些難度的,因為挨個判斷質數的方法時間複雜度太高,不可行。一般的做法是,開闢乙個有10000個元素的bool型陣列prime[10000],然後從2開始到根號10000,即100結束,把這些數的倍數都設定為false,例如:取2的時候,prime[4],prime[6],prime[8],prime[10]...都會被設定為false,這樣結束之後,再從頭掃一遍prime,把裡面還是true的陣列的下標輸出,即為範圍內所有質數。不過,我當時很二的說了一句「這道題我做過」,現在想想實在是大忌啊,如果大家面試的時候遇到做過的題,一定不要馬上承認做過,因為有的面試官會很不爽,面子掛不住,感覺自己出的題簡單了,然後就會來一道巨難的題虐你。還好我遇到的這位面試官人比較隨和,說我還挺誠實,但是,不出意外的提高了題的難度。他說我這個基本已經接近最優的時間複雜度了,但是有些值,比如prime[6],在2和3的時候被重複設定了2次false,所以還有更快一點的,讓我想一想。我當時心裡各種無語啊,之前做poj上面題的時候從來沒想過還有更快一點的。然後我冥思苦想了幾分鐘,想到了質數和合數的特點,把設定false的規則修改了一下,如果到第n個數,並且該數是true,那麼從n開始,下標為n乘以n之後(包括n)為true的陣列元素都被設定為false,例如:2的時候,4,6,8,10...都被設定為false,那麼3的時候,3*3,3*5,3*7...都被設定為false,因為2,4..都是false了,所以不會出現3*2,3*4等被重複設定為false的情況,這樣就能保證每個合數僅被設定為false一次。因此,這種方法比原來的快一些(其實就快了一點點)。

答完了上面兩道題,一面基本就結束了,面試官就讓我回去等通知了。這次面試大概有2個小時,半個小時問簡歷,1個半小時問演算法。

二面過程

二面是一位女面試官,人很好,完全看不出是做技術研發的,我的第一反應她應該是管理團隊的,不過面試一開始我就發現自己錯了,她的科研基礎實在是太好了。在此,再一次提醒大家,千萬不要把自己一知半解的東西放到簡歷上,遇上較真的面試官,肯定會悲劇的。接著說二面,她首先很有針對性的挑了我簡歷上那種一筆帶過的東西問,看我是不是真的做過。問了大概10分鐘,她開始問我的基礎知識,在模式識別和機器學習領域學習了什麼,我跟她說對於常用的分類器都比較熟悉,她讓我對常用的分類器的熟悉程度排一下序,我說自己實現過adaboost,隨機森林沒寫過但是肯定能寫出來,svm用過,知道原理,神經網路了解原理,最不熟悉。她接著讓我介紹神經網路的原理(挑我最不熟悉……),我想了1分鐘,大致把節點的構成,怎麼連線每一層,用梯度下降訓練之類的說了一通,說實話我好久沒看神經網路了,的確不算很熟了。她可能不是很滿意吧,然後又追問svm和神經網路的區別。乙個是線性分類器,乙個是非線性分類器,這個區別其實還是挺明顯的,接著我又跟她侃了一下最近比較火的深度學習(deep learning),表達了一下自己的看法,深度學習這個東西,其實計算複雜度太高,並不能覆蓋所有的機器學習領域,而且是否一定要依賴於神經網路,其實也存在爭議,因為有國外的團隊用聚類(k-means)和線性分類器(svm)組合的方式達到了跟受限波爾茲曼機(rbm)接近甚至超越的效果,大概說了20分鐘,她算是比較滿意我的回答了。接下來她問了乙個很簡單但是挺值得注意的問題,在影象處理方面經常需要讀取,動態申請乙個二維陣列也很常見,她讓我寫一下我是怎麼做的,下面**是兩種常見的方式

//

方法1unsigned char** pimg= new unsigned char*[m];

for(int i=0;i

//方法2

unsigned char** pimg= new unsigned char*[m];

unsigned char* arr= new unsigned char[m*n];

for(int i=0;i

第一種都能想到,但是速度慢,申請記憶體是分開申請的,所以總的效率完全趕不上第二種。第二種是一次申請記憶體,for迴圈僅僅是對指標的賦值。另一方面,在釋放的時候,第二種容易忘記釋放二維指標的每個元素,也需要迴圈釋放。而第二種就沒有這種問題,只需要delete arr和delete pimg即可。

總的感覺就是,第二輪面試就輕鬆了很多,大概只有40分鐘。面試官問的都是跟他們研究內容相關的知識,所以基礎知識很重要,另外,如果有些東西,自己不知道直說就是了,如果不懂裝懂反而讓面試官很反感。

當然,這個是我的面試經歷,不過面試是因人而異,因面試官而異的,所以大家不要照搬,如果能幫助到大家,那是最好了。裡面應該還有一些錯誤和問題,望不吝賜教。

2013騰訊暑期實習筆試

筆試題目由20道3分的不定項選擇題 注意是不定項選擇!博主悲劇就 於此,全部當單選來做,考完還納悶為什麼有的題目感覺幾個選項都對 以及10道4分的填空題目構成。範圍覆蓋了程式語言基礎 如巨集定義 資料結構 演算法的複雜度 二叉樹等 資料庫的一些概念 作業系統 記憶體管理 以及網路 協議 位址 的部分...

筆試分析之騰訊2013暑期實習

4月份的筆試,考得不好,經過暑期的磨礪,回頭再看那些題目,有些就豁然開朗了 1.關於型別轉換 1.32 位機上根據下面的 問哪些說法是正確的?signedchar a 0xe0 unsignedint b a unsignedchar c a a.a 0 c 0 為真b.a c 為真c.b 的十六進...

微軟2013暑期實習筆試回憶

一共是20道選擇題 有可能多選 答對加分,答錯扣分,所以了不敢亂選啊,現在開始回憶一些題目 1 有1000瓶水,其中1瓶是有毒的,小老鼠如果喝了有毒的水會在乙個星期後死掉,問至少需要多少只小老鼠來做實驗,才能夠在一星期後選出有毒的一瓶水。我選的是10,2 10 1024 1000,原理跟1 n選擇器...