腾讯技术面试题及答案解析_第1页
腾讯技术面试题及答案解析_第2页
腾讯技术面试题及答案解析_第3页
腾讯技术面试题及答案解析_第4页
腾讯技术面试题及答案解析_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年腾讯技术面试题及答案解析一、编程基础(5题,每题10分,共50分)1.题目:请实现一个函数,输入一个非负整数`n`,返回`n`的二进制表示中`1`的个数。例如,输入`11`,输出`3`(因为`11`的二进制表示为`1011`,有`3`个`1`)。答案解析:方法一:遍历二进制位,逐个判断每一位是否为`1`。cppintcountBits(intn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}方法二:利用位运算技巧,每次将`n`与`n-1`进行`&`运算,可以消除最右边的`1`。cppintcountBits(intn){intcount=0;while(n){n&=(n-1);count++;}returncount;}方法三:内置函数(仅部分语言支持)。cppintcountBits(intn){return__builtin_popcount(n);}2.题目:给定一个字符串`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.题目:实现一个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.题目:给定一个链表,反转其节点,并返回反转后的链表。例如,输入`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.题目:实现快速排序算法,不使用递归。答案解析:迭代法使用辅助栈模拟递归。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);}}二、系统设计(2题,每题25分,共50分)1.题目:设计一个高并发的短链接系统。要求:-输入任意长度的URL,输出固定长度的短链接(如`/abc123`)。-支持高并发访问,支持自定义域名。-提供幂等性(相同长链接对应相同长链接)。答案解析:核心思想:使用哈希算法将长链接映射为短链接,结合分布式缓存和数据库实现高并发。步骤:1.哈希算法:-使用MD5或SHA256对长链接进行哈希,取前几位作为短ID(如`abc123`)。-为避免冲突,可使用布隆过滤器或哈希表记录已使用的短ID。2.分布式缓存:-使用Redis或Memcached缓存短链接与长链接的映射,加速查询。-设置过期时间,避免缓存污染。3.数据库:-持久化短链接与长链接的映射,支持自定义域名(如`/abc123`)。4.幂等性:-通过哈希算法确保相同长链接生成相同短链接。-使用分布式锁或事务保证并发写入的一致性。架构图:plaintext长链接输入->哈希算法->短链接生成->分布式缓存查询->数据库写入->返回短链接伪代码:cppstringgenerateShortLink(longlongid){stringhash=md5(longLink);return"/"+hash.substr(0,6);}5.题目:设计一个高并发的实时消息推送系统(如微信、钉钉)。要求:-支持大规模用户(百万级),支持离线推送。-支持多种推送方式(消息、通知)。-具有高可用性和低延迟。答案解析:核心思想:使用消息队列+缓存+数据库实现异步推送。步骤:1.消息队列:-使用Kafka或RabbitMQ接收推送请求,解耦服务。-消息包含用户ID、消息内容、推送类型等。2.推送策略:-在线推送:通过WebSocket或长连接实时推送。-离线推送:推送请求写入Redis,用户上线后同步。3.缓存层:-使用Redis缓存用户在线状态,快速判断是否在线。4.数据库:-持久化用户信息和推送记录,支持分页查询。5.高可用:-消息队列和数据库使用集群部署,避免单点故障。-推送服务使用多副本部署,负载均衡。架构图:plaintext推送请求->消息队列->推送服务(在线/离线)->用户端伪代码:cppvoidpushMessage(longuserId,stringmessage){queue.push({userId,message,"message"});}三、数据库与分布式(3题,每题15分,共45分)1.题目:解释数据库索引的作用,并说明B+树索引与哈希索引的区别。答案解析:索引作用:-加速查询:通过索引快速定位数据,避免全表扫描。-支持事务:保证查询的ACID特性。B+树vs哈希索引:-B+树:-适用于范围查询(如`ageBETWEEN10AND20`)。-数据有序存储,支持前缀匹配。-时间复杂度O(logn)。-哈希索引:-适用于精确查询(如`id=100`)。-时间复杂度O(1)。-不支持范围查询。2.题目:设计一个分布式数据库的缓存策略,要求:-支持TPS达到10w+。-缓存命中率大于90%。-支持动态扩容。答案解析:策略:1.多级缓存:-L1:本地内存缓存(如RedisCluster),优先命中。-L2:分布式缓存(如Memcached),备份L1。2.缓存策略:-LRU:优先淘汰最久未使用的数据。-Write-Through:写入时同时更新缓存和数据库。3.动态扩容:-使用分片(Sharding)将数据分散到多个节点。-通过监听缓存命中率动态调整分片。伪代码:cppif(cache.get(key)!=null){returncache.get(key);}else{returndb.get(key);}3.题目:解释CAP理论,并说明在分布式数据库中如何实现最终一致性。答案解析:CAP理论:-C(Consistency):任意节点访问数据返回相同结果。-A(Availability):任何请求都能得到响应(不保证是最新数据)。-P(Partitiontolerance):网络分区下仍能继续服务。最终一致性实现:-版本号:数据写入时带上版本号,读取时检查版本冲突。-消息队列:通过Kafka等异步更新其他节点。-TTL:设置缓存过期时间,保证数据最终同步。四、网络与安全(2题,每题15分,共30分)1.题目:解释TCP的三次握手过程,并说明为什么需要四次挥手。答案解析:三次握手:1.SYN:客户端发送SYN包,请求连接。2.SYN+ACK:服务器回复SYN+ACK包,同意连接。3.ACK:客户端发送ACK包,连接建立。四次挥手:-由于TCP是全双工通信,需要双方分别关闭连接。1.FIN:客户端发送FIN包,表示数据发送完毕。2.ACK:服务器回复ACK包,确认收到。3.FIN:服务器发送FIN包,表示数据发送完毕。4.ACK:客户端回复ACK包,确认收到,等待计时器超时后关闭连接。2.题目:设计一个防止SQL注入的方案。答案解析:方案:1.预编译语句(PreparedStatements):-将SQL语句和参数分离,防止恶意注入。javaPreparedStatementstmt=conn.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论