版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年美团技术部面试题及答案详解一、编程基础(5题,每题6分,共30分)1.题目(6分):编写一个函数,实现将一个字符串中的所有大写字母转换为小写字母,所有小写字母转换为大写字母,其余字符保持不变。例如,输入`"HelloWorld!"`,输出`"hELLOwORLD!"`。答案:pythondefswap_case(s:str)->str:return''.join([char.lower()ifchar.isupper()elsechar.upper()forcharins])示例print(swap_case("HelloWorld!"))#输出:hELLOwORLD!解析:-使用列表推导式遍历字符串中的每个字符。-`char.isupper()`判断字符是否为大写,若为真则转为小写;否则转为大写。-`''.join()`将列表中的字符拼接成新字符串。2.题目(6分):实现一个函数,计算一个列表中所有奇数的平方和。例如,输入`[1,2,3,4,5]`,输出`1²+3²+5²=35`。答案:pythondefsum_of_odd_squares(nums:list)->int:returnsum(x2forxinnumsifx%2!=0)示例print(sum_of_odd_squares([1,2,3,4,5]))#输出:35解析:-列表推导式筛选出所有奇数(`x%2!=0`)。-`x2`计算每个奇数的平方。-`sum()`求和。3.题目(6分):编写一个递归函数,实现斐波那契数列的第n项。例如,`fib(5)`返回`5`(斐波那契序列:0,1,1,2,3,5)。答案:pythondeffib(n:int)->int:ifn<=1:returnnreturnfib(n-1)+fib(n-2)示例print(fib(5))#输出:5解析:-递归终止条件:`n<=1`时返回`n`。-递归关系:`fib(n)=fib(n-1)+fib(n-2)`。-注意:此方法效率低,实际面试可能要求优化(如动态规划)。4.题目(6分):实现一个函数,检查一个字符串是否为回文(正读反读相同)。例如,输入`"madam"`,输出`True`。答案:pythondefis_palindrome(s:str)->bool:returns==s[::-1]示例print(is_palindrome("madam"))#输出:True解析:-`s[::-1]`反转字符串。-判断反转前后是否相同。5.题目(6分):编写一个函数,实现二分查找算法,在有序数组中查找目标值,返回其索引(若不存在则返回`-1`)。例如,`search([1,2,3,4,5],3)`返回`2`。答案:pythondefsearch(arr:list,target:int)->int:left,right=0,len(arr)-1whileleft<=right:mid=(left+right)//2ifarr[mid]==target:returnmidelifarr[mid]<target:left=mid+1else:right=mid-1return-1示例print(search([1,2,3,4,5],3))#输出:2解析:-初始化`left`和`right`指针。-每次取中间值`mid`与目标比较:-相等返回`mid`;-大于目标则右指针左移;-小于目标则左指针右移。-若未找到则返回`-1`。二、数据结构与算法(5题,每题6分,共30分)1.题目(6分):实现一个LRU(最近最少使用)缓存,支持`get(key)`和`put(key,value)`操作。例如:-`put(1,1)`→缓存为`{1:1}`;-`put(2,2)`→缓存为`{1:1,2:2}`;-`get(1)`→返回`1`;-`put(3,3)`,容量为2→删除`2`,缓存为`{1:1,3:3}`。答案:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.order=[]defget(self,key:int)->int:ifkeyinself.cache:self.order.remove(key)self.order.append(key)returnself.cache[key]return-1defput(self,key:int,value:int)->None:ifkeyinself.cache:self.order.remove(key)eliflen(self.cache)>=self.capacity:oldest=self.order.pop(0)delself.cache[oldest]self.cache[key]=valueself.order.append(key)示例lru=LRUCache(2)lru.put(1,1)lru.put(2,2)print(lru.get(1))#输出:1lru.put(3,3)#删除key=2print(lru.cache)#输出:{1:1,3:3}解析:-使用字典`cache`存储键值对,列表`order`记录访问顺序。-`get`操作:若存在则移动到末尾(表示最近使用);-`put`操作:若已存在则更新并移动到末尾;若超出容量则删除最久未使用的键(`order[0]`)。2.题目(6分):给定一个二叉树,判断其是否为完全二叉树。例如:1/\23/\45为完全二叉树。答案:pythonfromcollectionsimportdequeclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefis_complete_binary_tree(root:TreeNode)->bool:ifnotroot:returnTruequeue=deque([root])flag=Falsewhilequeue:node=queue.popleft()ifnode:ifflag:returnFalse#后面出现非空节点flag=Truequeue.append(node.left)queue.append(node.right)else:flag=True#遇到空节点后,后续所有节点必须为空returnTrue示例root=TreeNode(1)root.left=TreeNode(2)root.right=TreeNode(3)root.left.left=TreeNode(4)root.left.right=TreeNode(5)print(is_complete_binary_tree(root))#输出:True解析:-层序遍历二叉树:-遇到第一个空节点后,后续所有节点必须为空。-若在空节点后遇到非空节点,则不是完全二叉树。3.题目(6分):实现一个函数,合并多个有序链表,返回合并后的头节点。例如:-链表1:`1->4->5`;-链表2:`1->3->4`;-合并后:`1->1->3->4->4->5`。答案:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextdefmerge_k_lists(lists:list)->ListNode:ifnotlists:returnNonedefmerge_two(l1,l2):dummy=ListNode(0)current=dummywhilel1andl2:ifl1.val<=l2.val:current.next=l1l1=l1.nextelse:current.next=l2l2=l2.nextcurrent=current.nextcurrent.next=l1orl2returndummy.nextwhilelen(lists)>1:lists.append(merge_two(lists.pop(0),lists.pop(0)))returnlists[0]示例l1=ListNode(1,ListNode(4,ListNode(5)))l2=ListNode(1,ListNode(3,ListNode(4)))merged=merge_k_lists([l1,l2])whilemerged:print(merged.val,end='->')merged=merged.next输出:1->1->3->4->4->5->解析:-分治法:-每次合并两个链表,直到只剩一个链表。-辅助函数`merge_two`合并两个有序链表。4.题目(6分):给定一个无重复字符的字符串,返回其所有子集。例如,`"abc"`的子集为`["","a","b","c","ab","ac","bc","abc"]`。答案:pythondefsubsets(s:str)->list:res=[]subset=[]defbacktrack(start):res.append(''.join(subset))foriinrange(start,len(s)):subset.append(s[i])backtrack(i+1)subset.pop()backtrack(0)returnres示例print(subsets("abc"))输出:['','a','ab','abc','ac','b','bc','c']解析:-回溯算法:-每次选择或不选择当前字符,递归生成所有子集。-`start`防止重复选择字符。5.题目(6分):实现一个函数,统计一个数组中所有“坏”数字的数量。定义“坏”数字为:该数字大于其左边和右边的数字。例如,`[2,1,5,0,4,6]`中,`5`和`4`为“坏”数字,返回`2`。答案:pythondefcount_bad_numbers(nums:list)->int:n=len(nums)ifn<3:return0bad=[0]nforiinrange(1,n-1):ifnums[i]>nums[i-1]andnums[i]>nums[i+1]:bad[i]=1returnsum(bad)示例print(count_bad_numbers([2,1,5,0,4,6]))#输出:2解析:-遍历数组,判断每个数字是否大于左右邻居。-使用辅助数组`bad`记录“坏”数字的位置。三、系统设计(2题,每题12分,共24分)1.题目(12分):设计一个短链接(TinyURL)服务。用户输入长链接,系统返回短链接;点击短链接可跳转回长链接。要求:-短链接全局唯一且长度尽可能短。-支持高并发访问。答案:系统架构:1.前端服务(APIGateway):-负责接收用户请求(生成短链接、跳转长链接)。-使用负载均衡(如Nginx)分发请求。2.短链接生成服务:-使用分布式ID生成算法(如Snowflake或UUID)。-将ID映射为62进制短码(`a-z`,`A-Z`,`0-9`)。3.数据库:-关系型数据库(如MySQL)或NoSQL(如Redis)存储短码<->长链接映射。4.缓存层(可选):-Redis缓存热点短链接,降低数据库压力。5.反向代理/CDN:-高并发时使用CDN缓存短链接图片,加速访问。伪代码:pythondefgenerate_short_url(long_url:str)->str:生成唯一IDid=generate_unique_id()short_code=encode_base62(id)store_mapping(short_code,long_url)returnf"/{short_code}"defdecode_long_url(short_url:str)->str:short_code=extract_code(short_url)long_url=retrieve_mapping(short_code)returnlong_url解析:-ID生成:Snowflake算法可生成分布式唯一ID。-短码编码:将ID转为62进制字符(如`1→a`,`62→zA`)。-高并发:使用Redis缓存热点数据,数据库读写分离。2.题目(12分):设计一个实时消息推送系统(如微信通知),支持多用户订阅和离线消息存储。要求:-支持按标签(如“订单更新”)订阅消息。-用户离线时,消息存储在数据库中,上线后推送。答案:系统架构:1.消息中心(MQ):-使用Kafka或RabbitMQ存储消息。-发布订阅模式:生产者发布消息,消费者按标签订阅。2.用户订阅管理:-数据库存储用户ID<->标签映射。-支持动态添加/删除标签。3.消息存储(可选):-Redis存储离线消息,过期后推送。4.推送服务:-实时推送(WebSocket或长轮询);-离线推送(APNS/FCM)。伪代码:python用户订阅defsubscribe_user(user_id:str,tag:str):store_subscription(user_id,tag)发布消息defpublish_message(tag:str,message:str):mq.publish(tag,message)推送消息defpush_message(user_id:str,message:str):ifis_user_online(user_id):send_realtime_push(user_id,message)else:store_offline_message(user_id,message)解析:-MQ保证高并发:消息异步处理,削峰填谷。-离线消息:Redis存储,过期后重试。-推送方式:WebSocket实时,APNS离线。四、数据库与存储(2题,每题12分,共24分)1.题目(12分):设计一个用户表(`users`),包含以下字段:-`id`(主键,自增);-`username`(唯一,非空);-`email`(唯一,可选,可为空);-`regist_time`(注册时间,非空);-`last_login`(最后登录时间,可为空)。要求:-支持高并发写入;-`email`列需优化查询性能。答案:表设计:sqlCREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,emailVARCHAR(100)UNIQUEDEFAULTNULL,regist_timeTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,last_loginTIMESTAMPDEFAULTNULL)ENGINE=InnoDB;优化策略:1.索引:-主键`id`自动建立索引。-`username`和`email`建立唯一索引,加速查询。2.写入优化:-InnoDB引擎支持行级锁,避免写入冲突。-分区表(按时间分区)可提升写入性能。3.`email`查询优化:-建立唯一索引,避免全表扫描。-若查询频繁,可考虑使用倒排索引(Elasticsearch)。解析:-InnoDB优势:支持事务、行锁、MVCC,适合高并发场景。-唯一索引:防止数据重复,加速查找。2.题目(12分):设计一个商品库存系统,支持高并发扣减库存。要求:-库存为整数,扣减后不能为负。-支持超卖场景处理。答案:系统架构:1.库存表(`inventory`):sqlCREATETABLEinventory(product_idINTPRIMARYKEY,stockINTNOTNULLCHECK(stock>=0))ENGINE=InnoDB;2.扣减逻辑:-分布式锁(Redis):pythonlock=redis.lock(f"stock:{product_id}",timeout=5)iflock.acquire():try:stock=get_stock(product_id)ifstock>=amount:update_stock(product_id,stock-amount)returnTrueelse:handle_over_selling()finally:lock.release()returnFalse-乐观锁(版本号):sqlUPDATEinventorySETstock=stock-?,version=version+1WHEREproduct_id=?ANDstock>=?ANDversion=?3.超卖处理:-拉取库存时检查`stock>=amount`,若不足则补偿(如重新上架)。解析:-分布式锁:避免超卖(Redis实现)。-乐观锁:减少锁竞争,但需处理冲突重试。五、综合应用(1题,共14分)1.题目(14分):美团外卖需统计骑手接单效率,要求:-输入骑手接单数据(`order_id`,`rider_id`,`accept_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东省江门市高职单招英语考试题库(附含答案)
- 《中国肺移植生物样本库构建临床指南(2025年版)》解读
- 达芬奇密码介绍课件
- 中考语文文言文对比阅读(全国)01 《咏雪》对比阅读(解析版)
- 边境地方安全员培训
- 车队调度安全培训课件
- 煤矿成立防灭火团队方案
- 2025钢结构原理试题及答案
- 《光的折射》物理授课课件
- (2025)中班科学探究活动设计与幼儿动手能力提升工作心得(2篇)
- 2026年度内蒙古自治区行政执法人员专场招收备考题库完整答案详解
- 农产品采购合同2025年协议
- 2025年江苏省公务员录用考试行测题A类答案及解析
- 道路危险货物运输企业安全隐患排查与治理制度
- 京东物流合同范本
- 养老机构安全生产责任制清单
- 《红岩》中考试题(解析版)-2026年中考语文名著复习核心知识梳理与专项训练
- 非洲鼓基础知识培训课件
- 2026-2031中国酿酒设备行业市场现状调查及投资前景研判报告
- KET考试必背核心短语(按场景分类)
- 2025四川产业振兴基金投资集团有限公司应届毕业生招聘9人笔试历年难易错考点试卷带答案解析2套试卷
评论
0/150
提交评论