版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年美团技术部面试全攻略及答案一、编程能力测试(共5题,每题10分,总分50分)1.题目:编写一个函数,实现LRU(LeastRecentlyUsed)缓存机制的删除操作。输入为当前缓存的数据结构(使用哈希表和双向链表实现),输出为删除最久未使用元素后的缓存状态。答案:pythonclassNode:def__init__(self,key,value):self.key=keyself.value=valueself.prev=Noneself.next=NoneclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.head=Node(0,0)self.tail=Node(0,0)self.head.next=self.tailself.tail.prev=self.headdefget(self,key:int)->int:ifkeyinself.cache:node=self.cache[key]self._remove(node)self._add(node)returnnode.valuereturn-1defput(self,key:int,value:int)->None:ifkeyinself.cache:self._remove(self.cache[key])node=Node(key,value)self.cache[key]=nodeself._add(node)iflen(self.cache)>self.capacity:lru=self.head.nextself._remove(lru)delself.cache[lru.key]def_remove(self,node:Node)->None:delself.cache[node.key]node.prev.next=node.nextnode.next.prev=node.prevdef_add(self,node:Node)->None:node.next=self.head.nextnode.next.prev=nodeself.head.next=nodenode.prev=self.head示例测试cache=LRUCache(2)cache.put(1,1)cache.put(2,2)print(cache.get(1))#返回1cache.put(3,3)#去除键2print(cache.get(2))#返回-1解析:LRU缓存通过双向链表和哈希表实现,链表头部为最近使用,尾部为最久未使用。`get`操作将节点移到头部,`put`操作先删除旧节点再添加新节点,若超出容量则删除尾部节点。2.题目:给定一个整数数组,返回所有和为target的三个数的组合。答案:pythondefthreeSum(nums:List[int])->List[List[int]]:nums.sort()result=[]n=len(nums)foriinrange(n):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==0:result.append([nums[i],nums[left],nums[right]])whileleft<rightandnums[left]==nums[left+1]:left+=1whileleft<rightandnums[right]==nums[right-1]:right-=1left+=1right-=1eliftotal<0:left+=1else:right-=1returnresult解析:排序后使用双指针法,固定第一个数,另两个指针从左右遍历。去重避免重复组合。3.题目:实现一个简单的线程安全计数器,支持`increment`和`get`操作。答案:pythonimportthreadingclassCounter:def__init__(self):self.value=0self.lock=threading.Lock()defincrement(self):withself.lock:self.value+=1defget(self):withself.lock:returnself.value示例测试counter=Counter()threading.Thread(target=counter.increment).start()threading.Thread(target=counter.increment).start()print(counter.get())#输出2解析:使用`threading.Lock`确保多线程下计数器原子性操作。4.题目:设计一个算法,找出数组中未排序的区间,返回最小和最大未排序元素的位置。答案:pythondeffindUnsortedSubarray(nums:List[int])->List[int]:n=len(nums)start,end=-1,-2max_seen,min_seen=float('-inf'),float('inf')foriinrange(n):ifnums[i]<max_seen:end=ielse:max_seen=nums[i]ifnums[n-1-i]>min_seen:start=n-1-ielse:min_seen=nums[n-1-i]return[start,end]解析:从左到右找最大未排序元素,从右到左找最小未排序元素,区间为`[start,end]`。5.题目:实现一个函数,检查二叉树是否为平衡二叉树(每个节点的左右子树高度差不超过1)。答案:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefisBalanced(root:TreeNode)->bool:defcheck(node):ifnotnode:return0left=check(node.left)right=check(node.right)ifleft==-1orright==-1orabs(left-right)>1:return-1returnmax(left,right)+1returncheck(root)!=-1示例测试root=TreeNode(3)root.left=TreeNode(9)root.right=TreeNode(20)root.right.left=TreeNode(15)root.right.right=TreeNode(7)print(isBalanced(root))#输出True解析:递归检查每个节点的高度差,若任意节点不平衡则返回-1。二、系统设计(共2题,每题25分,总分50分)1.题目:设计一个高并发的短链接系统(如tinyURL),要求支持高并发访问、快速生成和解析链接。答案:-数据结构:-使用哈希表存储`短码<->长码`映射,支持O(1)查询。-使用分布式缓存(如RedisCluster)缓存热点数据。-短码生成:-使用随机算法生成6位短码(如`base62`编码:`a-z,A-Z,0-9`)。-分布式部署:-根据短码哈希到不同节点,避免单点压力。-高并发优化:-使用异步IO(如`asyncio`)处理请求。-限流策略(如令牌桶算法)防止过载。解析:核心在于快速映射和分布式扩展,短码生成需避免冲突,缓存热点数据提升响应速度。2.题目:设计一个实时消息推送系统(如微信消息),支持单聊、群聊、离线推送等功能。答案:-架构:-使用MQ(如Kafka)接收消息,保证顺序性。-用户订阅消息,通过WebSocket或长连接推送实时消息。-离线推送:-缓存未读消息,用户上线后补发。-高可用:-消息分片存储,多副本备份。-扩展性:-使用微服务架构,按用户ID或聊天ID隔离。解析:关键在于消息队列保证顺序,长连接或MQ实现实时性,离线缓存提升用户体验。三、数据库与分布式(共3题,每题15分,总分45分)1.题目:如何设计一个高并发的订单表,支持高并发写入和查询?答案:-分库分表:-按订单ID哈希分库,表内按时间或用户分表。-写入优化:-使用消息队列异步写入,减轻数据库压力。-查询优化:-索引优化(如订单ID、用户ID、时间戳)。-缓存热点订单(如Redis)。解析:核心在于分布式扩展和异步写入,索引和缓存提升查询性能。2.题目:如何解决分布式事务问题(如Seata或2PC)?答案:-2PC:-优点:强一致性,但阻塞严重。-缺点:网络分区时无法提交。-TCC(Try-Confirm-Cancel):-业务自行实现补偿。-Saga:-将事务拆分为多个本地事务,最终补偿失败操作。解析:根据业务选择方案,2PC适合强一致性场景,TCC/Saga更灵活但实现复杂。3.题目:设计一个分布式ID生成方案(如TwitterSnowflake)。答案:-Snowflake算法:-时间戳(41位)+工作机器ID(10位)+序列号(12位)。-优化:-使用Redis缓存时间戳,避免时钟回拨。-分布式部署时调整机器ID避免冲突。解析:核心是时间+机器ID+序列号的组合,需保证全局唯一且高性能。四、算法与数据结构(共5题,每题10分,总分50分)1.题目:实现快速排序算法,并分析其时间复杂度。答案:pythondefquicksort(nums:List[int])->List[int]:iflen(nums)<=1:returnnumspivot=nums[len(nums)//2]left=[xforxinnumsifx<pivot]middle=[xforxinnumsifx==pivot]right=[xforxinnumsifx>pivot]returnquicksort(left)+middle+quicksort(right)解析:时间复杂度O(nlogn),最坏O(n²),平均分治递归。2.题目:实现LRU缓存的数据结构,支持`get`和`put`操作。答案:(同第一题LRU缓存实现)解析:双向链表+哈希表,保证O(1)时间复杂度。3.题目:如何设计一个高并发的秒杀系统?答案:-分布式锁:-使用Redis或ZooKeeper实现锁。-限流:-令牌桶算法控制并发量。-秒杀逻辑:-预减库存,避免超卖。解析:核心是锁和限流,避免数据库超卖。4.题目:设计一个分布式爬虫系统,支持去重和并发抓取。答案:-去重:-使用布隆过滤器或Redis缓存已抓取URL。-并发:-使用多线程或进程池,队列控制任务分配。-分布式:-按URL哈希分配到不同节点。解析:去重和并发是关键,分布式扩展提升效率。5.题目:实现一个字符串匹配算法(如KMP)。答案:pythondefkmp(text:str,pattern:str)->int:defcomputeLPS(pattern):lps=[0]len(pattern)length=0i=1whilei<len(pattern):ifpattern[i]==pattern[length]:length+=1lps[i]=lengthi+=1else:iflength!=0:length=lps[length-1]else:lps[i]=0i+=1returnlpslps=co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中化学中绿色化学理念与实践教学的课题报告教学研究课题报告
- 高中数学:量子加密通信中的数论应用研究教学研究课题报告
- 2025年山东第一医科大学马克思主义基本原理概论期末考试参考题库
- 初中音乐教学中智慧云平台大数据应用与教学互动效果评估教学研究课题报告
- 2024年怀化学院马克思主义基本原理概论期末考试真题汇编
- 2024年陕西航天职工大学马克思主义基本原理概论期末考试真题汇编
- 2025年广东建设职业技术学院马克思主义基本原理概论期末考试笔试真题汇编
- 2024年郑州体育职业学院马克思主义基本原理概论期末考试笔试题库
- 2025年广西蓝天航空职业学院马克思主义基本原理概论期末考试笔试真题汇编
- 2025年天津师范大学马克思主义基本原理概论期末考试真题汇编
- 麻醉科工作总结
- 弹塑性力学完整版本
- 小学生预防寄生虫
- 洛必 达法则课件
- 【MOOC】《高级语言程序设计》(南京邮电大学)章节中国大学慕课答案
- 吉林大学《模拟电子电路》2021-2022学年期末试卷
- 2024秋国开《社会调查研究与方法》形成性考核2参考答案(第2套)
- 企业信息咨询服务合同
- 斜墙模板施工计算书
- CJJT210-2014 城镇排水管道非开挖修复更新工程技术规程
- ISO28000:2022供应链安全管理体系
评论
0/150
提交评论