版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年腾讯技术专家面试题集及解答要点一、编程基础与数据结构(5题,每题20分,共100分)题目1(20分)实现一个LRU(LeastRecentlyUsed)缓存机制,要求:1.支持自定义缓存大小2.提供get和put操作3.使用链表和哈希表实现,分析时间复杂度答案要点:javaclassLRUCache<K,V>{privateintcapacity;privateMap<K,Node>map;privateNodehead,tail;staticclassNode<K,V>{Kkey;Vvalue;Node<K,V>prev,next;Node(Kkey,Vvalue){this.key=key;this.value=value;}}publicLRUCache(intcapacity){this.capacity=capacity;map=newHashMap<>();head=newNode<>(null,null);tail=newNode<>(null,null);head.next=tail;tail.prev=head;}publicVget(Kkey){Node<K,V>node=map.get(key);if(node==null)returnnull;moveToHead(node);returnnode.value;}publicvoidput(Kkey,Vvalue){Node<K,V>node=map.get(key);if(node==null){Node<K,V>newNode=newNode<>(key,value);map.put(key,newNode);addNode(newNode);if(map.size()>capacity){Node<K,V>tailNode=removeTail();map.remove(tailNode.key);}}else{node.value=value;moveToHead(node);}}privatevoidaddNode(Node<K,V>node){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}privatevoidremoveNode(Node<K,V>node){node.prev.next=node.next;node.next.prev=node.prev;}privatevoidmoveToHead(Node<K,V>node){removeNode(node);addNode(node);}privateNode<K,V>removeTail(){Node<K,V>res=tail.prev;removeNode(res);returnres;}}解析:-使用双向链表维护访问顺序,头节点为最近访问,尾节点为最久未访问-使用HashMap实现O(1)时间复杂度的get操作-put操作时,如果缓存已满,则移除链表尾部节点(最久未使用)-时间复杂度:get和put均为O(1)题目2(20分)给定一个整数数组,设计算法找出数组中未出现的最小正整数。要求:1.不使用额外空间2.时间复杂度优于O(n²)答案要点:javapublicintfirstMissingPositive(int[]nums){intn=nums.length;//Step1:Placeeachnumberinitsrightpositionfor(inti=0;i<n;i++){while(nums[i]>0&&nums[i]<=n&&nums[nums[i]-1]!=nums[i]){swap(nums,i,nums[i]-1);}}//Step2:Findthefirstindexwherethenumberdoesn'tmatchfor(inti=0;i<n;i++){if(nums[i]!=i+1){returni+1;}}returnn+1;}privatevoidswap(int[]nums,inti,intj){inttemp=nums[i];nums[i]=nums[j];nums[j]=temp;}解析:-第一步将每个数放到其应该的位置(如数字1应该放在索引0)-第二步遍历数组,第一个不满足nums[i]==i+1的索引i,则结果为i+1-如果所有位置都正确,则结果为n+1-时间复杂度:O(n),空间复杂度:O(1)题目3(20分)实现二叉树的层序遍历(BFS),要求:1.使用队列实现2.返回遍历结果的列表,每个列表元素为该层节点值答案要点:javaimportjava.util.;publicclassBinaryTreeLevelOrderTraversal{publicList<List<Integer>>levelOrder(TreeNoderoot){List<List<Integer>>result=newArrayList<>();if(root==null)returnresult;Queue<TreeNode>queue=newLinkedList<>();queue.offer(root);while(!queue.isEmpty()){intlevelSize=queue.size();List<Integer>currentLevel=newArrayList<>();for(inti=0;i<levelSize;i++){TreeNodenode=queue.poll();currentLevel.add(node.val);if(node.left!=null)queue.offer(node.left);if(node.right!=null)queue.offer(node.right);}result.add(currentLevel);}returnresult;}staticclassTreeNode{intval;TreeNodeleft,right;TreeNode(intx){val=x;}}}解析:-使用队列先进先出特性实现BFS-每次处理当前层的所有节点,然后处理下一层-时间复杂度:O(n),空间复杂度:O(n)题目4(20分)设计一个数据结构支持以下操作:1.addWord(word):添加单词2.search(word):搜索单词,支持通配符''(匹配任意字符序列)3.要求search操作时间复杂度尽可能低答案要点:pythonclassTrieNode:def__init__(self):self.children={}self.is_end=FalseclassWordDictionary:def__init__(self):self.root=TrieNode()defaddWord(self,word:str)->None:node=self.rootforcharinword:ifcharnotinnode.children:node.children[char]=TrieNode()node=node.children[char]node.is_end=Truedefsearch(self,word:str)->bool:defdfs(j,node):ifj==len(word):returnnode.is_endchar=word[j]ifchar=='':Tryallpossiblepathsforchildinnode.children.values():ifdfs(j+1,child):returnTruereturnFalseelse:ifcharnotinnode.children:returnFalsereturndfs(j+1,node.children[char])returndfs(0,self.root)解析:-使用前缀树(Trie)存储单词-addWord操作直接添加单词-search操作使用DFS处理通配符'':-当遇到''时,尝试所有子节点-其他字符直接匹配-时间复杂度:最坏情况下O(mn),m为单词长度,n为前缀树节点数题目5(20分)实现一个函数,判断二叉树是否是完全二叉树。要求:1.完全二叉树定义:除最后一层外,每一层节点都填满,且最后一层从左到右连续排列答案要点:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefisCompleteTree(root):ifnotroot:returnTruequeue=[root]end=Falsewhilequeue:node=queue.pop(0)ifnotnode:end=Trueelse:ifend:Afteranemptynode,allnodesmustbeemptyreturnFalsequeue.append(node.left)queue.append(node.right)returnTrue解析:-使用层序遍历-标记是否遇到空节点-遇到第一个空节点后,后续所有节点都必须为空-时间复杂度:O(n),空间复杂度:O(n)二、系统设计(3题,每题30分,共90分)题目6(30分)设计一个高并发的短URL生成系统。要求:1.支持高并发访问2.生成短URL与原始URL一一对应3.描述系统架构和核心模块答案要点:系统架构:++++++|LoadBalancer||URLShortener||Database||(Nginx/Apache)|->|(APIGateway)|->|(Redis/Mongo)|++++++||||||VVV++++++|CacheLayer||HashFunction||StorageLayer||(RedisCluster)||(Base62)||(ShardedDB)|++++++核心模块:1.APIGateway:-处理HTTP请求-负载均衡分发请求-缓存策略管理2.URLShortener:-使用Base62编码(a-z、A-Z、0-9)将ID转换为短URL-生成唯一ID(可使用Snowflake算法)-管理URL映射关系3.Database:-存储URL映射关系-支持分片和索引优化查询-使用Redis缓存热点数据4.CacheLayer:-使用RedisCluster实现高可用缓存-设置合理的过期时间-使用LRU策略淘汰旧数据关键考虑:-使用分布式缓存减少数据库压力-异步处理URL解析请求-设置合理的缓存过期时间-考虑跨区域部署方案题目7(30分)设计一个微博系统用户关注/取关功能。要求:1.支持万人关注动态2.支持实时更新关注列表3.描述数据模型和算法答案要点:数据模型:sqlCREATETABLEusers(user_idBIGINTPRIMARYKEY,usernameVARCHAR(50),followers_countBIGINT,following_countBIGINT);CREATETABLEfollowships(follower_idBIGINT,followee_idBIGINT,created_atTIMESTAMP,PRIMARYKEY(follower_id,followee_id),FOREIGNKEY(follower_id)REFERENCESusers(user_id),FOREIGNKEY(followee_id)REFERENCESusers(user_id));CREATETABLEposts(post_idBIGINTPRIMARYKEY,user_idBIGINT,contentTEXT,created_atTIMESTAMP,FOREIGNKEY(user_id)REFERENCESusers(user_id));CREATETABLEpost_feeds(post_idBIGINT,user_idBIGINT,created_atTIMESTAMP,FOREIGNKEY(post_id)REFERENCESposts(post_id),FOREIGNKEY(user_id)REFERENCESusers(user_id));算法:1.关注操作:sqlINSERTINTOfollowships(follower_id,followee_id)VALUES(?,?)UPDATEusersSETfollowing_count=following_count+1WHEREuser_id=?2.取关操作:sqlDELETEFROMfollowshipsWHEREfollower_id=?ANDfollowee_id=?UPDATEusersSETfollowing_count=following_count-1WHEREuser_id=?3.获取关注动态:-使用MaterializedView缓存关注列表sqlCREATEMATERIALIZEDVIEWfeed_viewASSELECTp.post_id,p.user_id,p.content,p.created_atFROMpostspINNERJOINfollowshipsfONp.user_id=f.followee_idWHEREf.follower_id=?ORDERBYp.created_atDESC-实时更新策略:-关注/取关操作触发RedisPub/Sub通知-客户端订阅通知并重新拉取关注列表-使用WebSocket实现实时推送题目8(30分)设计一个分布式消息队列(如Kafka),要求:1.支持高吞吐量2.处理消息丢失场景3.描述核心组件和工作流程答案要点:系统架构:++++++|Producers|>|Brokers|>|Consumers||(Application)|++++++|(Zookeeper)|++|(Cluster)|++||||VV++++|TopicPartition||OffsetManager|++++核心组件:1.Producer:-消息序列化-灵活的分区策略-重试机制和超时处理2.Broker:-存储消息分区-处理Producer和Consumer请求-使用Zookeeper管理集群元数据3.TopicPartition:-将消息分片存储-负载均衡策略-消息顺序保证4.OffsetManager:-管理消费进度-支持手动和自动提交-保证幂等性工作流程:1.消息发送:-Producer选择Topic-Broker分配Partition-消息写入Partition-确认写入成功2.消息消费:-Consumer订阅Topic-OffsetManager记录消费位置-Broker按顺序发送消息-Consumer确认消息处理完成消息丢失处理:-生产者确认机制:-同步确认(SyncAck)-异步确认(AsyncAck)-重试策略-消费者幂等性:-使用唯一消息ID-消息处理前检查状态-可靠存储:-持久化消息到磁盘-设置合适的副本因子三、数据库与存储(2题,每题20分,共40分)题目9(20分)设计一个高并发的订单数据库表。要求:1.支持高并发写入2.保证订单唯一性3.描述表结构和索引设计答案要点:表结构:sqlCREATETABLEorders(order_idBIGINTNOTNULLAUTO_INCREMENTPRIMARYKEY,user_idBIGINTNOTNULL,product_idBIGINTNOTNULL,quantityINTNOTNULL,priceDECIMAL(10,2)NOTNULL,statusVARCHAR(20)NOTNULLDEFAULT'pending',created_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,FOREIGNKEY(user_id)REFERENCESusers(user_id),FOREIGNKEY(product_id)REFERENCESproducts(product_id),UNIQUEKEY(user_id,product_id,status))ENGINE=InnoDB;索引设计:1.主键索引:order_id(聚簇索引)2.外键索引:user_id,product_id3.复合唯一索引:user_id,product_id,status(防止同一用户同一商品多次下单)4.查询优化索引:-user_id+status(查询用户待处理订单)-product_id+created_at(查询商品销售排行)-status+created_at(查询订单处理流程)高并发优化:-使用MySQLCluster或ShardingSphere实现读写分离-设置合适的binlog格式和大小-使用Redi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐厨垃圾收集工创新意识模拟考核试卷含答案
- 2025年音频切换台项目合作计划书
- 核物探工安全生产基础知识能力考核试卷含答案
- 学院例会请假条模板
- 2025年数控板料折弯机项目发展计划
- 2025年超高压电缆连接件项目合作计划书
- 2025-2030拉脱维亚可再生能源产业发展现状调研及投资机遇
- 2025年西藏中考物理真题卷含答案解析
- 乡镇卫生院年度工作总结
- (2025年)医院消毒供应中心规范试题附答案
- 云南省茶叶出口竞争力分析及提升对策研究
- 银行情绪与压力管理课件
- 甲状腺危象护理查房要点
- 《无人机飞行安全及法律法规》第3版全套教学课件
- 2025内蒙古电力集团招聘笔试考试笔试历年参考题库附带答案详解
- 交通警察道路执勤执法培训课件
- 十五五学校五年发展规划(2026-2030)
- 洗浴员工协议书
- GB/T 17642-2025土工合成材料非织造布复合土工膜
- 清欠历史旧账协议书
- 乙肝疫苗接种培训
评论
0/150
提交评论