騰訊技術(shù)面試題及答案解析_第1頁
騰訊技術(shù)面試題及答案解析_第2頁
騰訊技術(shù)面試題及答案解析_第3頁
騰訊技術(shù)面試題及答案解析_第4頁
騰訊技術(shù)面試題及答案解析_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2026年騰訊技術(shù)面試題及答案解析一、編程基礎(chǔ)(5題,每題10分,共50分)1.題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)非負(fù)整數(shù)`n`,返回`n`的二進(jìn)制表示中`1`的個(gè)數(shù)。例如,輸入`11`,輸出`3`(因?yàn)閌11`的二進(jìn)制表示為`1011`,有`3`個(gè)`1`)。答案解析:方法一:遍歷二進(jìn)制位,逐個(gè)判斷每一位是否為`1`。cppintcountBits(intn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}方法二:利用位運(yùn)算技巧,每次將`n`與`n-1`進(jìn)行`&`運(yùn)算,可以消除最右邊的`1`。cppintcountBits(intn){intcount=0;while(n){n&=(n-1);count++;}returncount;}方法三:內(nèi)置函數(shù)(僅部分語言支持)。cppintcountBits(intn){return__builtin_popcount(n);}2.題目:給定一個(gè)字符串`s`,判斷其是否是回文串(忽略大小寫和非字母字符)。例如,輸入`"Aman,aplan,acanal:Panama"`,輸出`true`。答案解析:雙指針法,從兩端向中間遍歷,忽略非字母字符。cppboolisPalindrome(strings){intleft=0,right=s.size()-1;while(left<right){while(left<right&&!isalnum(s[left]))left++;while(left<right&&!isalnum(s[right]))right--;if(tolower(s[left])!=tolower(s[right]))returnfalse;left++;right--;}returntrue;}3.題目:實(shí)現(xiàn)一個(gè)LRU(LeastRecentlyUsed)緩存,支持`get`和`put`操作。容量為`capacity`。例如:cppLRUCachecache=newLRUCache(2);cache.put(1,1);//緩存是{1=1}cache.put(2,2);//緩存是{1=1,2=2}cache.get(1);//返回1cache.put(3,3);//去除鍵2,緩存是{1=1,3=3}cache.get(2);//返回-1(未找到)答案解析:使用哈希表+雙向鏈表。哈希表記錄鍵值,雙向鏈表記錄訪問順序。cppclassLRUCache{private:structNode{intkey,val;Nodeleft,right;Node(intk,intv):key(k),val(v),left(nullptr),right(nullptr){}};unordered_map<int,Node>cache;Nodehead=newNode(0,0),tail=newNode(0,0);intcapacity;voidinsert(Nodenode){node->left=head;node->right=head->right;head->right->left=node;head->right=node;}voidremove(Nodenode){node->left->right=node->right;node->right->left=node->left;}public:LRUCache(intcapacity_):capacity(capacity_){}intget(intkey){if(cache.find(key)==cache.end())return-1;Nodenode=cache[key];remove(node);insert(node);returnnode->val;}voidput(intkey,intvalue){if(cache.find(key)!=cache.end()){Nodenode=cache[key];node->val=value;remove(node);insert(node);}else{if(cache.size()==capacity){cache.erase(tail->left->key);remove(tail->left);}Nodenode=newNode(key,value);cache[key]=node;insert(node);}}};4.題目:給定一個(gè)鏈表,反轉(zhuǎn)其節(jié)點(diǎn),并返回反轉(zhuǎn)后的鏈表。例如,輸入`1->2->3->4->5`,輸出`5->4->3->2->1`。答案解析:迭代法或遞歸法。cppListNodereverseList(ListNodehead){ListNodeprev=nullptr,curr=head;while(curr){ListNodenext=curr->next;curr->next=prev;prev=curr;curr=next;}returnprev;}5.題目:實(shí)現(xiàn)快速排序算法,不使用遞歸。答案解析:迭代法使用輔助棧模擬遞歸。cppvoidquickSort(vector<int>&nums){stack<int>st;st.push(0);st.push(nums.size()-1);while(!st.empty()){intright=st.top();st.pop();intleft=st.top();st.pop();if(left>=right)continue;intpivot=nums[right];inti=left-1;for(intj=left;j<right;j++){if(nums[j]<=pivot){i++;swap(nums[i],nums[j]);}}swap(nums[i+1],nums[right]);st.push(left);st.push(i);st.push(i+2);st.push(right);}}二、系統(tǒng)設(shè)計(jì)(2題,每題25分,共50分)1.題目:設(shè)計(jì)一個(gè)高并發(fā)的短鏈接系統(tǒng)。要求:-輸入任意長(zhǎng)度的URL,輸出固定長(zhǎng)度的短鏈接(如`/abc123`)。-支持高并發(fā)訪問,支持自定義域名。-提供冪等性(相同長(zhǎng)鏈接對(duì)應(yīng)相同長(zhǎng)鏈接)。答案解析:核心思想:使用哈希算法將長(zhǎng)鏈接映射為短鏈接,結(jié)合分布式緩存和數(shù)據(jù)庫實(shí)現(xiàn)高并發(fā)。步驟:1.哈希算法:-使用MD5或SHA256對(duì)長(zhǎng)鏈接進(jìn)行哈希,取前幾位作為短ID(如`abc123`)。-為避免沖突,可使用布隆過濾器或哈希表記錄已使用的短ID。2.分布式緩存:-使用Redis或Memcached緩存短鏈接與長(zhǎng)鏈接的映射,加速查詢。-設(shè)置過期時(shí)間,避免緩存污染。3.數(shù)據(jù)庫:-持久化短鏈接與長(zhǎng)鏈接的映射,支持自定義域名(如`/abc123`)。4.冪等性:-通過哈希算法確保相同長(zhǎng)鏈接生成相同短鏈接。-使用分布式鎖或事務(wù)保證并發(fā)寫入的一致性。架構(gòu)圖:plaintext長(zhǎng)鏈接輸入->哈希算法->短鏈接生成->分布式緩存查詢->數(shù)據(jù)庫寫入->返回短鏈接偽代碼:cppstringgenerateShortLink(longlongid){stringhash=md5(longLink);return"/"+hash.substr(0,6);}5.題目:設(shè)計(jì)一個(gè)高并發(fā)的實(shí)時(shí)消息推送系統(tǒng)(如微信、釘釘)。要求:-支持大規(guī)模用戶(百萬級(jí)),支持離線推送。-支持多種推送方式(消息、通知)。-具有高可用性和低延遲。答案解析:核心思想:使用消息隊(duì)列+緩存+數(shù)據(jù)庫實(shí)現(xiàn)異步推送。步驟:1.消息隊(duì)列:-使用Kafka或RabbitMQ接收推送請(qǐng)求,解耦服務(wù)。-消息包含用戶ID、消息內(nèi)容、推送類型等。2.推送策略:-在線推送:通過WebSocket或長(zhǎng)連接實(shí)時(shí)推送。-離線推送:推送請(qǐng)求寫入Redis,用戶上線后同步。3.緩存層:-使用Redis緩存用戶在線狀態(tài),快速判斷是否在線。4.數(shù)據(jù)庫:-持久化用戶信息和推送記錄,支持分頁查詢。5.高可用:-消息隊(duì)列和數(shù)據(jù)庫使用集群部署,避免單點(diǎn)故障。-推送服務(wù)使用多副本部署,負(fù)載均衡。架構(gòu)圖:plaintext推送請(qǐng)求->消息隊(duì)列->推送服務(wù)(在線/離線)->用戶端偽代碼:cppvoidpushMessage(longuserId,stringmessage){queue.push({userId,message,"message"});}三、數(shù)據(jù)庫與分布式(3題,每題15分,共45分)1.題目:解釋數(shù)據(jù)庫索引的作用,并說明B+樹索引與哈希索引的區(qū)別。答案解析:索引作用:-加速查詢:通過索引快速定位數(shù)據(jù),避免全表掃描。-支持事務(wù):保證查詢的ACID特性。B+樹vs哈希索引:-B+樹:-適用于范圍查詢(如`ageBETWEEN10AND20`)。-數(shù)據(jù)有序存儲(chǔ),支持前綴匹配。-時(shí)間復(fù)雜度O(logn)。-哈希索引:-適用于精確查詢(如`id=100`)。-時(shí)間復(fù)雜度O(1)。-不支持范圍查詢。2.題目:設(shè)計(jì)一個(gè)分布式數(shù)據(jù)庫的緩存策略,要求:-支持TPS達(dá)到10w+。-緩存命中率大于90%。-支持動(dòng)態(tài)擴(kuò)容。答案解析:策略:1.多級(jí)緩存:-L1:本地內(nèi)存緩存(如RedisCluster),優(yōu)先命中。-L2:分布式緩存(如Memcached),備份L1。2.緩存策略:-LRU:優(yōu)先淘汰最久未使用的數(shù)據(jù)。-Write-Through:寫入時(shí)同時(shí)更新緩存和數(shù)據(jù)庫。3.動(dòng)態(tài)擴(kuò)容:-使用分片(Sharding)將數(shù)據(jù)分散到多個(gè)節(jié)點(diǎn)。-通過監(jiān)聽緩存命中率動(dòng)態(tài)調(diào)整分片。偽代碼:cppif(cache.get(key)!=null){returncache.get(key);}else{returndb.get(key);}3.題目:解釋CAP理論,并說明在分布式數(shù)據(jù)庫中如何實(shí)現(xiàn)最終一致性。答案解析:CAP理論:-C(Consistency):任意節(jié)點(diǎn)訪問數(shù)據(jù)返回相同結(jié)果。-A(Availability):任何請(qǐng)求都能得到響應(yīng)(不保證是最新數(shù)據(jù))。-P(Partitiontolerance):網(wǎng)絡(luò)分區(qū)下仍能繼續(xù)服務(wù)。最終一致性實(shí)現(xiàn):-版本號(hào):數(shù)據(jù)寫入時(shí)帶上版本號(hào),讀取時(shí)檢查版本沖突。-消息隊(duì)列:通過Kafka等異步更新其他節(jié)點(diǎn)。-TTL:設(shè)置緩存過期時(shí)間,保證數(shù)據(jù)最終同步。四、網(wǎng)絡(luò)與安全(2題,每題15分,共30分)1.題目:解釋TCP的三次握手過程,并說明為什么需要四次揮手。答案解析:三次握手:1.SYN:客戶端發(fā)送SYN包,請(qǐng)求連接。2.SYN+ACK:服務(wù)器回復(fù)SYN+ACK包,同意連接。3.ACK:客戶端發(fā)送ACK包,連接建立。四次揮手:-由于TCP是全雙工通信,需要雙方分別關(guān)閉連接。1.FIN:客戶端發(fā)送FIN包,表示數(shù)據(jù)發(fā)送完畢。2.ACK:服務(wù)器回復(fù)ACK包,確認(rèn)收到。3.FIN:服務(wù)器發(fā)送FIN包,表示數(shù)據(jù)發(fā)送完畢。4.ACK:客戶端回復(fù)ACK包,確認(rèn)收到,等待計(jì)時(shí)器超時(shí)后關(guān)閉連接。2.題目:設(shè)計(jì)一個(gè)防止SQL注入的方案。答案解析:方案:1.預(yù)編譯語句(PreparedStatements):-將SQL語句和參數(shù)分離,防止惡意注入。javaPreparedStatementstmt=conn.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論