版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年腾讯研发工程师面试题及答案一、编程基础与数据结构(共5题,每题10分,总分50分)1.题目:实现一个函数,输入一个非负整数`n`,返回`n`的汉明重量(即二进制表示中`1`的个数)。例如,输入`11`(二进制`1011`),返回`3`。答案:cppinthammingWeight(intn){intcount=0;while(n!=0){count+=n&1;n>>=1;}returncount;}解析:使用位运算优化性能。每次通过`n&1`判断最低位是否为`1`,然后右移一位。时间复杂度为`O(logn)`。2.题目:给定一个数组`nums`,返回其中所有唯一的、不重复的三元组,使得`nums[i]+nums[j]+nums[k]==target`。例如,输入`nums=[-1,0,1,2]`,`target=0`,返回`[[-1,0,1]]`。答案:cppvector<vector<int>>threeSum(vector<int>&nums,inttarget){sort(nums.begin(),nums.end());vector<vector<int>>res;for(inti=0;i<nums.size();++i){if(i>0&&nums[i]==nums[i-1])continue;intj=i+1,k=nums.size()-1;while(j<k){intsum=nums[i]+nums[j]+nums[k];if(sum==target){res.emplace_back({nums[i],nums[j],nums[k]});while(j<k&&nums[j]==nums[j+1])j++;while(j<k&&nums[k]==nums[k-1])k--;j++;k--;}elseif(sum<target)j++;elsek--;}}returnres;}解析:先排序,然后固定一个数,用双指针法寻找另外两个数。注意去重避免重复解。3.题目:设计一个LRU(最近最少使用)缓存,支持`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:unordered_map<int,int>cache;list<int>keys;intcapacity;voidtouch(intkey){autoit=keys.find(key);if(it!=keys.end()){keys.erase(it);keys.emplace_front(key);}}public:LRUCache(intcapacity_):capacity(capacity_){}intget(intkey){if(cache.find(key)==cache.end())return-1;touch(key);returncache[key];}voidput(intkey,intvalue){if(cache.find(key)!=cache.end()){cache[key]=value;touch(key);}else{if(cache.size()==capacity){intoldest=keys.back();keys.pop_back();cache.erase(oldest);}cache[key]=value;keys.emplace_front(key);}}};解析:使用`unordered_map`存储键值对,`list`维护访问顺序。`get`时移动到头部,`put`时先删除旧值(如果容量满)。4.题目:给定一个链表,反转链表并返回反转后的头节点。例如,输入`1->2->3->4->5`,返回`5->4->3->2->1`。答案:cppListNodereverseList(ListNodehead){ListNodeprev=nullptr;ListNodecurr=head;while(curr){ListNodenext=curr->next;curr->next=prev;prev=curr;curr=next;}returnprev;}解析:迭代法反转链表,逐个节点调整指针方向。5.题目:实现一个函数,判断一个二叉树是否是平衡二叉树(即任意节点的左右子树高度差不超过1)。答案:cppintgetHeight(TreeNodenode){if(!node)return0;intleft=getHeight(node->left);intright=getHeight(node->right);if(left==-1||right==-1||abs(left-right)>1)return-1;returnmax(left,right)+1;}boolisBalanced(TreeNoderoot){returngetHeight(root)!=-1;}解析:后序遍历计算高度,如果发现高度差超过1或子树不平衡(返回-1),则整棵树不平衡。二、系统设计(共3题,每题15分,总分45分)1.题目:设计一个高并发的短链接系统。要求:-输入长链接,输出短链接(如`/abc123`)。-支持分布式部署。-每次访问短链接时,解析并返回对应的长链接。答案:核心思路:1.短链接生成:使用哈希算法(如CRC32或自定义算法)将长链接映射为短ID(如6位随机或递增ID)。2.分布式存储:使用Redis或Cassandra存储`短ID->长链接`映射,支持高并发读写。3.分布式ID生成:如果用递增ID,可使用Twitter的Snowflake算法(41位时间戳+10位机器ID+12位序列号)。4.缓存:用本地缓存(如LRU)缓存热点短链接,降低Redis访问压力。伪代码:cpp//生成短IDstringgenerateShortID(longlonglongID){//使用哈希或随机算法生成6位IDreturntoHex(longID);}//存储映射voidstoreMapping(stringshortID,stringlongURL){redis.set(shortID,longURL);}//获取长链接stringgetLongURL(stringshortID){stringlongURL=redis.get(shortID);if(longURL.empty()){//缓存未命中,查询数据库longURL=db.get(shortID);redis.set(shortID,longURL);//缓存结果}returnlongURL;}解析:关键在于ID生成和分布式存储。Redis的高并发性能适合此场景,Snowflake算法可确保全局唯一性。2.题目:设计一个消息队列系统(如Kafka或RabbitMQ),要求支持以下功能:-消息持久化(不丢失)。-消息顺序保证(同一消费者按发送顺序接收)。-支持至少一次、最多一次、精确一次消息传递。答案:核心思路:1.持久化:使用分布式存储(如HDFS或Ceph)存储消息,确保磁盘故障不丢失。2.顺序保证:将消息按发送者或主题分组,保证同一组的消息在队列中顺序存储。3.消息传递策略:-至少一次:默认重试机制,防止消息丢失。-最多一次:幂等消费(消费者幂等化处理)。-精确一次:使用事务或Redelivery计数(消费失败重试次数限制)。伪代码:cpp//消息存储structMessage{int64_toffset;//偏移量stringdata;inttries;//重试次数};//生产者voidproduce(stringtopic,stringdata){int64_toffset=db.nextOffset(topic);Messagemsg{offset,data,0};db.append(topic,msg);broker.publish(topic,msg);}//消费者voidconsume(stringtopic){while(true){Messagemsg=queue.poll(topic);try{process(msg.data);mit(topic,msg.offset);}catch(...){msg.tries++;if(msg.tries<=MAX_TRIES){queue.ack(topic,msg.offset);//重发}else{db.logError(topic,msg.offset);}}}}解析:顺序保证需要队列内部有序存储,精确一次需要幂等性设计。腾讯内部可能更关注高可用和低延迟。3.题目:设计一个高并发的秒杀系统。要求:-每秒限量(如1000个商品)。-防止超卖(即使并发极高)。-支持分布式锁或事务。答案:核心思路:1.限流:使用Redis的RateLimiter或Lua脚本控制并发。2.防超卖:-分布式锁:使用Redis或ZooKeeper锁。-库存减扣:扣减库存后判断是否小于0,是则回滚。3.幂等性:使用请求ID或Token防止重复下单。伪代码:cpp//限流Lua脚本stringluaRateLimit=R"(localkey=KEYS[1]locallimit=tonumber(ARGV[1])localnow=tonumber(ARGV[2])localwindow=tonumber(ARGV[3])localcount=redis.call('incr',key)ifcount==1thenredis.call('expire',key,window)endifcount<=limitthenreturn1elsereturn0end)";//秒杀逻辑bool秒杀(stringuserId,stringproductId){//限流检查if(redis.eval(luaRateLimit,1,"limit_"..productId,1000,timestamp,10)==0){returnfalse;//流量超限}//分布式锁if(redis.setnx("lock_"..productId,userId)==1){intstock=db.get("stock_"..productId);if(stock>0){db.decr("stock_"..productId);//下单逻辑returntrue;}else{redis.del("lock_"..productId);returnfalse;}}returnfalse;//被其他用户抢锁}解析:秒杀核心在于限流和库存同步,Redis的原子操作是关键。三、数据库与中间件(共3题,每题15分,总分45分)1.题目:设计一个高并发的订单表,要求:-支持高并发写入(每秒百万笔)。-订单号全局唯一。-支持按订单号或用户ID快速查询。答案:核心思路:1.订单号生成:使用Snowflake算法(41位时间戳+10位机器ID+12位序列号)。2.数据库设计:sqlCREATETABLEorders(idBIGINTAUTO_INCREMENTPRIMARYKEY,order_noBIGINTNOTNULLUNIQUE,user_idBIGINT,amountDECIMAL(10,2),statusTINYINT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);3.索引优化:-`order_no`唯一索引。-`user_id+created_at`组合索引(用于查询用户最近订单)。4.写入优化:-使用批量写入或Redis缓冲。-分库分表(如按`order_no`模分表)。解析:高并发写入需要数据库性能优化,Snowflake算法适用于分布式场景。腾讯内部可能使用自研中间件(如TBDS)。2.题目:设计一个消息队列的消费者重试机制。要求:-消息消费失败后,自动重试。-重试次数有限制(如3次)。-避免无限重试(如死信队列)。答案:核心思路:1.消息存储:Redis存储待重试消息(`retry_queue`)。2.重试策略:cppvoidprocessMessage(Message&msg){try{//处理消息mit(msg.offset);}catch(...){msg.tries++;if(msg.tries<=MAX_TRIES){//重入重试队列redis.rpush("retry_queue",msg.offset);}else{//死信队列redis.rpush("dead_letter_queue",msg.offset);}}}3.定时任务:后台消费`retry_queue`,动态调整重试间隔(如指数退避)。解析:重试机制需要避免资源耗尽,死信队列用于隔离无解消息。3.题目:如何优化MySQL的慢查询?答案:核心思路:1.慢查询日志:开启`slow_query_log`,设置阈值(如`long_query_time=1s`)。2.索引优化:-避免`IN`替代`=`(如`IN(1,2)`不如`=1OR=2`)。-避免`LIKE'prefix%'`(前缀索引)。3.SQL优化:sql--避免全表扫描SELECTFROMordersWHEREuser_id=1;//改为SELECTid,amountFROMordersWHEREuser_id=1;4.缓存:对热点查询使用Redis缓存。5.分库分表:垂直或水平拆分大表。解析:慢查询优化需从索引、SQL和架构层面综合解决,腾讯内部可能使用TDSQL等自研数据库。四、网络与分布式(共3题,每题15分,总分45分)1.题目:解释HTTP/2与HTTP/1.1的主要区别,并说明为何HTTP/2更适合高并发场景。答案:核心区别:1.多路复用:HTTP/2允许多个请求/响应在同一个TCP连接上并行传输,HTTP/1.1需多次连接。2.头部压缩:HTTP/2使用HPACK算法压缩头部,HTTP/1.1需多次发送相同头部。3.服务器推送:HTTP/2支持服务器主动推送资源(如JS、CSS)。为何更适合高并发:-减少连接开销:HTTP/1.1的“队头阻塞”问题在HTTP/2中缓解。-更低延迟
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 检查井预埋件施工方案
- 土方开挖回填施工方案及要点
- 水电施工方案范本案例分析
- 智慧城市社会治理施工方案
- 专项施工方案审查执行标准
- 顶管冬季施工方案要点解析
- 铣刨路面平整施工方案
- 屋顶保温隔热层施工方案
- 基于博弈的均衡控制-洞察及研究
- 电机制造供应链成本优化-洞察及研究
- 水利电工程施工地质规程
- DL∕T 5343-2018 110kV~750kV架空输电线路张力架线施工工艺导则
- 房产证授权委托书的模板
- 传染病防治知识试题库(共100题)
- 个人信息保护培训课件
- 理想信念教育励志类主题班会
- 《建筑基坑降水工程技术规程》DBT29-229-2014
- 特应性皮炎临床路径
- 2024届重庆外国语学校高一数学第一学期期末检测模拟试题含解析
- 2023年广东学业水平考试物理常考知识点
- 中山版-四年级第一学期综合实践活动教案
评论
0/150
提交评论