騰訊社招面試經(jīng)歷與問(wèn)題總結(jié)
前提:本人2011年畢業(yè)于一個(gè)普通本科,工作不到2年。
15號(hào)晚上7點(diǎn)多,正在炒菜做飯,騰訊忽然打電話來(lái)問(wèn)我對(duì)他們的Linux C++的職位是否感興趣,我表達(dá)了我感興趣之后,就開(kāi)始了一段簡(jiǎn)短的電話面試,電話面試主要內(nèi)容:C++和TCP socket通信的一些基礎(chǔ)知識(shí)。之后就問(wèn)我一道算法題:10億個(gè)整數(shù),隨機(jī)生成,可重復(fù),求最大的前1萬(wàn)個(gè)。當(dāng)時(shí)我一下子就蒙了,沒(méi)反應(yīng)過(guò)來(lái),何況我還正在燒著菜呢,所以我就沒(méi)細(xì)想,說(shuō)了一個(gè)連我都鄙視我的思路:我說(shuō)導(dǎo)入數(shù)據(jù)庫(kù),然后用select語(yǔ)句選出最大的前1萬(wàn)個(gè)??赡芪业拇鸢高B面試官都無(wú)語(yǔ)了,所以他就沒(méi)再往下問(wèn)了,不過(guò)他還是通知我明天16號(hào)早上去騰訊大廈筆試,由于我明天沒(méi)空,就推遲到了17號(hào)早上10點(diǎn)。至此,整個(gè)電話面試就結(jié)束了。過(guò)后,我想了想,10億個(gè)整數(shù)選前1萬(wàn)個(gè)大數(shù),其實(shí)可以用:分治法+hash+多路歸并排序來(lái)做,比如說(shuō),先把10億個(gè)整數(shù)對(duì)1000取模,存儲(chǔ)到1000個(gè)文件中,然后對(duì)每一個(gè)文件進(jìn)行內(nèi)部排序(比如快速排序,從大到小排序),然后再對(duì)這1000個(gè)文件進(jìn)行多路歸并,取出前1萬(wàn)個(gè)最大的數(shù)即可。
17號(hào)早上,懷著忐忑不安的心情,終于來(lái)到了騰訊大廈,在前臺(tái)說(shuō)明情況后,領(lǐng)了一個(gè)臨時(shí)訪問(wèn)牌,一個(gè)看起來(lái)30多歲的中年人(暫且稱為面試官A)接待了我,給我一份筆試題,時(shí)間為1小時(shí)。5道程序輸出寫結(jié)果或者程序找錯(cuò),5道編程題。這5道編程題大概為:
1、將一個(gè)4字節(jié)的整數(shù)的二進(jìn)制表示中的001替換為011,輸出替換后的整數(shù)。
2、將一個(gè)數(shù)組右移幾位,比如數(shù)組為1 2 3 4,右移一位即為4 1 2 3。
3、輸入一個(gè)表示十六進(jìn)制的字符串,轉(zhuǎn)換為十進(jìn)制的整數(shù)輸出。
4、單鏈表反轉(zhuǎn)。
5、一個(gè)8*8的方格子,A點(diǎn)在左下角,B點(diǎn)在右上角,求A點(diǎn)到B點(diǎn)的最短路徑有多少條。
第1題,我理解錯(cuò)題意了,順便鄙視一下自己,我當(dāng)時(shí)的想法是這樣的:整數(shù)有正有負(fù),不能拿該整數(shù)直接右移,所以我用了一個(gè)unsigned int mode = 7進(jìn)行左移,是直接拿整數(shù)與mode相與,得到的結(jié)果與001比較,相同就替換,不同就把mode左移3位再與整數(shù)相與。面試官A直接指出我的思路有問(wèn)題,相等替換后mode左移3位,不相等應(yīng)該將mode左移1位,而不是左移3位,只有相等才把mode左移3位。這里順便說(shuō)一下,筆試完之后,面試官A是拿著你的筆試題一題一題的問(wèn)你,根據(jù)你的題目結(jié)果要你說(shuō)出你的計(jì)算過(guò)程的。
題目:將一個(gè)4字節(jié)整數(shù)的二進(jìn)制表示中的001替換為011
答:
int replace(int num)
{
unsigned int mode3bit = 7;
unsigned int mode1bit = 1;
int shift = 0;
int result = 0;
while (shift < 32)
{
while (shift < 32 && (num & (mode3bit<<shift)) != (1<<shift))
{
result += (num & (mode1bit<<shift));
shift++;
}
if (shift >= 32)
{
break;
}
else if (32 - shift < 3) //高位不足3位
{
result += (num & (mode3bit<<shift));
break;
}
result += (3<<shift);
shift += 3;
}
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
int num = 12345678; //0b0000 0000 1011 1100 0110 0001 0100 1110
assert(29156190 == replace(num)); //29156190 0b0000 0001 1011 1100 1110 0011 0101 1110
num = 1227133513; //0b0100 1001 0010 0100 1001 0010 0100 1001
assert(1533916891 == replace(num)); //1533916891 0b0101 1011 0110 1101 1011 0110 1101 1011
num = 613566757; //0b0010 0100 1001 0010 0100 1001 0010 0101
assert(1840700269 == replace(num)); //1840700269 0b0110 1101 1011 0110 1101 1011 0110 1101
num = -809737911; //0b1100 1111 1011 1100 0110 0001 0100 1001
assert(-541269157 == replace(num)); //-541269157 0b1101 1111 1011 1100 1110 0011 0101 1011
num = -920350135; //0b1100 1001 0010 0100 1001 0010 0100 1001
assert(-613566757 == replace(num)); //-613566757 //0b1101 1011 0110 1101 1011 0110 1101 1011
return 0;
}
第2題,由于這道題我之前做過(guò),思路就是:先把左邊反轉(zhuǎn),再把右邊反轉(zhuǎn),最后把整個(gè)數(shù)組反轉(zhuǎn)就可以得到結(jié)果。但是悲劇的是,面試官A要我用數(shù)學(xué)證明我這種方法的正確性,o(╯□╰)o,最后我只能說(shuō):我之前做過(guò)這道題。如果當(dāng)時(shí),我能套用線性代數(shù)中矩陣的轉(zhuǎn)置的思想來(lái)說(shuō)明這道題,那么這道題的證明可能說(shuō)得過(guò)去。所以說(shuō),要對(duì)你寫的代碼負(fù)責(zé),要知其然,更要知其所以然。類似題目:
題目:左旋轉(zhuǎn)字符串
要求:對(duì)長(zhǎng)度為n的字符串操作的時(shí)間復(fù)雜度為O(n),輔助內(nèi)存為O(1)。
舉例:把字符串a(chǎn)bcdef左旋轉(zhuǎn)2位得到字符串cdefab。
答:
#include "stdafx.h"
#include <iostream>
using namespace std;
void swap(char *str, int begin, int end)
{
char ch;
while (begin < end)
{
ch = *(str + begin);
*(str + begin) = *(str + end);
*(str + end) = ch;
begin++;
end--;
}
}
void Rotate(char *str, int length ,int m)
{
if (NULL == str || length == 1)
{
return;
}
swap(str, 0, m - 1);
swap(str, m, length - 1);
swap(str, 0, length - 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
char chArr[] = "abcdef";
char *p = chArr;
cout<<p<<endl;
Rotate(p, strlen(chArr), 2);
cout<<p<<endl;
return 0;
}
運(yùn)行界面如下:

第3題,進(jìn)制轉(zhuǎn)換,簡(jiǎn)單,不過(guò)要分別考慮大小寫字母。
第4題:
題目:?jiǎn)捂湵砟嬷?/strong>
舉例:原來(lái)鏈表為1->2->3->4->5翻轉(zhuǎn)為5->4->3->2->1
鏈表結(jié)點(diǎn)定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
答:
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
//構(gòu)造鏈表
void CreateList(ListNode *&pHead)
{
fstream fin("list.txt");
ListNode *pNode = NULL;
ListNode *pTmp = NULL;
int data;
fin>>data;
while (data)
{
pNode = new ListNode;
pNode->m_nKey = data;
pNode->m_pNext = NULL;
if (NULL == pHead)
{
pHead = pNode;
pTmp = pNode;
}
else
{
pTmp->m_pNext = pNode;
pTmp = pNode;
}
fin>>data;
}
}
//翻轉(zhuǎn)單鏈表
void ReverseLink(ListNode *&pHead)
{
if (NULL == pHead)
{
return;
}
ListNode *pNode = pHead;
ListNode *Prev = NULL;
ListNode *pNext = NULL;
while (NULL != pNode)
{
pNext = pNode->m_pNext;
if (NULL == pNext)
{
pHead = pNode;
}
pNode->m_pNext = Prev;
Prev = pNode;
pNode = pNext;
}
}
void PrintList(ListNode *pHead)
{
if (NULL == pHead)
{
return;
}
ListNode *pNode = pHead;
while (NULL != pNode)
{
cout<<pNode->m_nKey<<" ";
pNode = pNode->m_pNext;
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
ListNode *pHead = NULL;
cout<<"原來(lái)的鏈表:";
CreateList(pHead);
PrintList(pHead);
ReverseLink(pHead);
cout<<"翻轉(zhuǎn)的鏈表:";
PrintList(pHead);
return 0;
}
運(yùn)行界面如下:

建造鏈表的list.txt文件如下:
12 11 10 9 8 7 6 5 4 3 2 1 0
第5題,我也是想錯(cuò)了方向,由于沒(méi)有時(shí)間了,代碼我沒(méi)寫,我只寫了個(gè)思路:即從A點(diǎn)開(kāi)始用廣度優(yōu)先搜索,第一個(gè)到達(dá)B點(diǎn)的肯定是最短路徑,記下此時(shí)A點(diǎn)到B點(diǎn)的步數(shù),然后統(tǒng)計(jì)從A到B點(diǎn)等于這個(gè)步數(shù)的個(gè)數(shù)。其實(shí),廣度優(yōu)先搜索只能求出最短路徑,但不能求出所有的最短路徑個(gè)數(shù),要想求出所有最短路徑的個(gè)數(shù),要用回溯法(后面我會(huì)給出代碼)。想想當(dāng)時(shí)面試的時(shí)候還振振有詞的向面試官A講解我的思路,也不知道面試官A是怎么想的,也不指出我的錯(cuò)誤,怕是怕我難堪吧。
面試官A面完之后已經(jīng)是12點(diǎn)多了,這是又來(lái)了一個(gè)27、8歲的大哥(暫且稱為面試官B)來(lái)面試我,一上來(lái)就給我一道編程題,實(shí)現(xiàn)大數(shù)相加,給出代碼。我又刷刷的寫了20多分鐘,認(rèn)為沒(méi)問(wèn)題了,就拿給面試官B看,看了一小會(huì),就指出我的代碼錯(cuò)在什么地方了,(哎,畢竟是手寫代碼,錯(cuò)誤肯定很多),要我改正,一步一步的引導(dǎo)我將我的代碼改正,非常和藹的一位大哥哥,也是和我聊的最久的,聊到了下午2點(diǎn)多,差不多兩個(gè)鐘頭,期間主要問(wèn)的問(wèn)題各種各樣都有:
1、技術(shù)相關(guān):map的實(shí)現(xiàn)機(jī)制是怎么樣的??;模板類的偏特化;動(dòng)態(tài)加載dll和靜態(tài)加載dll的區(qū)別;線程和進(jìn)程的區(qū)別;TCP的四次揮手協(xié)議;給定兩個(gè)數(shù)組a和b,求所有在a數(shù)組中不在b數(shù)組的元素;快速排序的平均時(shí)間復(fù)雜度是多少,證明它的平均時(shí)間復(fù)雜度等。這些問(wèn)題我都一一說(shuō)出了我的答案,主要是我看過(guò)一點(diǎn)<stl源碼剖析>、<算法導(dǎo)論>,所以沒(méi)覺(jué)的有什么難度,好像他也覺(jué)得我回答的還不錯(cuò)。
2、其他:3點(diǎn)一刻,求此時(shí)時(shí)針和分針夾角的度數(shù);對(duì)騰訊這個(gè)公司怎么看;為什么離職;個(gè)人規(guī)劃等。
面試官B面完之后,叫我先出去吃午飯,下午回來(lái)還有一次面試。吃飯歸來(lái)之后,又來(lái)了一位也是27、8歲的大哥(暫且稱為面試官C),給我?guī)椎肋壿嬵},要我20分鐘寫出答案,在我和他講解我的邏輯題之后,他問(wèn)了幾個(gè)我不熟悉的或者已經(jīng)記不清答案的問(wèn)題:一個(gè)進(jìn)程由哪些方面構(gòu)成,我記得<windows核心編程>一書上有講,但我記不清了,吱吱嗚嗚也沒(méi)說(shuō)出一個(gè)所以然來(lái),之后又問(wèn)了一個(gè)我不懂怎樣回答的問(wèn)題:你認(rèn)為你的優(yōu)勢(shì)是什么?作為一個(gè)二流學(xué)校畢業(yè)的屌絲,工作還不到2年,沒(méi)學(xué)歷,項(xiàng)目經(jīng)驗(yàn)又沒(méi)什么亮點(diǎn)。實(shí)在不懂怎么說(shuō),憋了半天只說(shuō)出一句:我基礎(chǔ)還行。之后就沒(méi)在問(wèn)問(wèn)題了,最后面試官B通知我可以回去了。哎,這可能就是導(dǎo)致我最后悲劇的原因吧。
總結(jié):
1、沒(méi)有大公司面試經(jīng)驗(yàn),并且由于事先也完全沒(méi)有做準(zhǔn)備,好像趕鴨子上架
2、基礎(chǔ)一定要扎實(shí),C++,數(shù)據(jù)結(jié)構(gòu)和算法,操作系統(tǒng),網(wǎng)絡(luò)編程要熟悉。
3、對(duì)自己寫的代碼負(fù)責(zé)
4、騰訊的員工非常友好
近期目標(biāo):
1、看數(shù)據(jù)結(jié)構(gòu)和算法
2、熟悉C++編程規(guī)范。
3、多看別人寫的優(yōu)秀源碼,爭(zhēng)取自己寫的代碼簡(jiǎn)潔易懂
最后:
給出筆試的最后一道編程題的題目和我寫的答案,如果有任何問(wèn)題,請(qǐng)指正。
題目:給定一個(gè)8*8的方格子,如下圖所示,求A點(diǎn)到B點(diǎn)的最短路徑有多少條?用算法實(shí)現(xiàn)。
答:從圖中可以看出,A點(diǎn)到B點(diǎn)的最短路徑為16,即A點(diǎn)橫走8小格,縱走8小格才能最快到達(dá)B點(diǎn),這是排列組合的問(wèn)題,即從最短路徑16中選取8個(gè)橫走的小格子(或者從最短路徑16中選取8個(gè)縱走的小格子)。所以從A點(diǎn)到B點(diǎn)的最短路徑條數(shù),直接可以算出來(lái),即為:

代碼如下:
size_t g_num = 0; //統(tǒng)計(jì)A點(diǎn)到B點(diǎn)的最短路徑條數(shù)
void shortestPathNumber(char grid[9][9], int row, int col, int &step)
{
if (row < 0 || row > 8 || col < 0 || col > 8 || grid[row][col] == '*' || step > 16)
{
return;
}
if (row == 0 && col == 8)
{
if (step == 16) //已到達(dá)B點(diǎn),且等于最短路徑16,就累加
{
g_num++;
}
}
else
{
grid[row][col] = '*'; //標(biāo)記該點(diǎn)已訪問(wèn)
step++;
shortestPathNumber(grid, row, col + 1, step);
shortestPathNumber(grid, row + 1, col, step);
shortestPathNumber(grid, row, col - 1, step);
shortestPathNumber(grid, row - 1, col, step);
grid[row][col] = '.'; //回溯
step--;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char grid[9][9] = {0};
int step = 0;
shortestPathNumber(grid, 8, 0, step); //從A點(diǎn)開(kāi)始搜索
cout<<"A點(diǎn)到B點(diǎn)的最短路徑條數(shù)為: "<<g_num<<endl;
return 0;
}
運(yùn)行界面如下:

相關(guān)文章
騰訊后端面試經(jīng)歷與經(jīng)驗(yàn)總結(jié)
這篇文章主要介紹了騰訊后端面試經(jīng)歷與經(jīng)驗(yàn),總結(jié)分析了騰訊面試過(guò)程中所經(jīng)歷的問(wèn)題、面試流程、相關(guān)注意事項(xiàng)與失敗經(jīng)驗(yàn)總結(jié),需要的朋友可以參考下2019-11-25- 這篇文章主要介紹了2019年騰訊最新前端工程師面試題(附答案),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-11-21
- 這篇文章主要介紹了騰訊面試算法題之編碼問(wèn)題,結(jié)合具體案例形式分析了基于java的編碼轉(zhuǎn)換相關(guān)算法原理與操作技巧,需要的朋友可以參考下2019-10-08
騰訊的外包c(diǎn)++面試經(jīng)歷總結(jié)
這篇文章主要介紹了騰訊的外包c(diǎn)++面試經(jīng)歷,總結(jié)記錄了一次騰訊C++面試的經(jīng)歷,包括面試的流程、面試題目與相應(yīng)的參考答案,需要的朋友可以參考下2019-09-29騰訊游戲客戶端開(kāi)發(fā)面試經(jīng)歷記錄
這篇文章主要介紹了騰訊游戲客戶端開(kāi)發(fā)面試經(jīng)歷,整理記錄了騰訊游戲開(kāi)發(fā)面試中遇到的各種問(wèn)題與心得體會(huì),需要的朋友可以參考下2019-09-24騰訊游戲客戶端開(kāi)發(fā)面試經(jīng)歷分享
這篇文章主要介紹了騰訊游戲客戶端開(kāi)發(fā)面試經(jīng)歷,總結(jié)分享了騰訊游戲客戶端開(kāi)發(fā)面試所涉及到的考點(diǎn)與注意事項(xiàng),需要的朋友可以參考下2019-09-20
9月最新184道阿里、百度、騰訊、頭條Java面試題合集(小結(jié))
這篇文章主要介紹了9月最新184道阿里、百度、騰訊、頭條Java面試題合集,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-09騰訊前端面試題相關(guān)知識(shí)點(diǎn)集錦
這篇文章主要介紹了騰訊前端面試題相關(guān)知識(shí)點(diǎn),整理總結(jié)了騰訊前端面試中所涉及的相關(guān)基礎(chǔ)知識(shí)點(diǎn)與疑難問(wèn)題,需要的朋友可以參考下2019-08-27
2019騰訊后臺(tái)開(kāi)發(fā)詳細(xì)面試流程詳解
這篇文章主要介紹了2019騰訊后臺(tái)開(kāi)發(fā)詳細(xì)面試流程詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-08-09騰訊這套SpringMvc面試題你懂多少知識(shí)(面試必備)
本文詳細(xì)的介紹了SpringMvc面試題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-28



