版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2026年美團(tuán)技術(shù)面試題庫及答案詳解一、編程基礎(chǔ)(5題,每題10分,共50分)1.題目(10分):請(qǐng)編寫一個(gè)函數(shù),實(shí)現(xiàn)判斷一個(gè)字符串是否為“回文串”?;匚拇侵刚x和反讀都相同的字符串,例如“l(fā)evel”、“上海自來水來自海上”等。要求不使用任何內(nèi)置函數(shù),僅用Python實(shí)現(xiàn)。答案:pythondefis_palindrome(s:str)->bool:s=''.join(cforcinsifc.isalnum()).lower()#去除非字母數(shù)字字符并轉(zhuǎn)為小寫left,right=0,len(s)-1whileleft<right:ifs[left]!=s[right]:returnFalseleft+=1right-=1returnTrue解析:首先對(duì)字符串進(jìn)行預(yù)處理,去除空格和標(biāo)點(diǎn)符號(hào),并統(tǒng)一轉(zhuǎn)為小寫以忽略大小寫差異。然后使用雙指針法,從字符串兩端向中間遍歷,若任意字符不匹配則不是回文串。時(shí)間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。2.題目(10分):請(qǐng)實(shí)現(xiàn)一個(gè)LRU(最近最少使用)緩存,要求支持get和put操作。緩存容量為固定值,超出容量時(shí)需淘汰最久未使用的元素。使用Python實(shí)現(xiàn)。答案:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.order=[]defget(self,key:int)->int:ifkeynotinself.cache:return-1self.order.remove(key)self.order.append(key)returnself.cache[key]defput(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)解析:使用哈希表`cache`存儲(chǔ)鍵值對(duì),列表`order`記錄訪問順序。get操作時(shí)將訪問的鍵移到列表末尾表示最近使用;put操作時(shí)若鍵已存在則更新順序,若超出容量則刪除最久未使用的元素(列表第一個(gè))。時(shí)間復(fù)雜度為O(1)。3.題目(10分):給定一個(gè)鏈表,請(qǐng)反轉(zhuǎn)其結(jié)構(gòu),并返回反轉(zhuǎn)后的頭節(jié)點(diǎn)。假設(shè)鏈表節(jié)點(diǎn)定義如下:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=next答案:pythondefreverse_list(head:ListNode)->ListNode:prev,curr=None,headwhilecurr:next_node=curr.nextcurr.next=prevprev=currcurr=next_nodereturnprev解析:使用三指針法:prev為前驅(qū)節(jié)點(diǎn),curr為當(dāng)前節(jié)點(diǎn),next_node暫存下一個(gè)節(jié)點(diǎn)。循環(huán)中逐個(gè)反轉(zhuǎn)next指向,最終prev為反轉(zhuǎn)后的頭節(jié)點(diǎn)。時(shí)間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。4.題目(10分):請(qǐng)實(shí)現(xiàn)快速排序算法,對(duì)任意整數(shù)數(shù)組進(jìn)行排序。要求原地排序(不使用額外數(shù)組),并給出平均時(shí)間復(fù)雜度和最壞時(shí)間復(fù)雜度。答案:pythondefquick_sort(arr:list,left:int,right:int)->None:ifleft>=right:returnpivot=arr[left]low,high=left,rightwhilelow<high:whilelow<highandarr[high]>=pivot:high-=1arr[low]=arr[high]whilelow<highandarr[low]<=pivot:low+=1arr[high]=arr[low]arr[low]=pivotquick_sort(arr,left,low-1)quick_sort(arr,low+1,right)解析:選擇基準(zhǔn)值(pivot)后,通過雙指針法將數(shù)組分為小于和大于基準(zhǔn)的兩部分,然后遞歸排序子數(shù)組。平均時(shí)間復(fù)雜度為O(nlogn),最壞為O(n2)(如已排序數(shù)組)。原地排序避免額外空間。5.題目(10分):請(qǐng)編寫一個(gè)函數(shù),統(tǒng)計(jì)一個(gè)二叉樹中所有路徑和為特定值(如8)的路徑數(shù)量。假設(shè)二叉樹節(jié)點(diǎn)定義如下:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=right答案:pythondefpath_sum(root:TreeNode,target:int)->int:defdfs(node,current_sum,path_count):ifnotnode:returnpath_countcurrent_sum+=node.valifcurrent_sum==target:path_count+=1path_count=dfs(node.left,current_sum,path_count)path_count=dfs(node.right,current_sum,path_count)returnpath_countreturndfs(root,0,0)解析:采用深度優(yōu)先搜索(DFS)遍歷樹,累加路徑和。若當(dāng)前路徑和等于目標(biāo)值則計(jì)數(shù)。遞歸左右子樹并回溯。時(shí)間復(fù)雜度為O(n2)(最壞情況),空間復(fù)雜度為O(n)(遞歸棧)。二、系統(tǒng)設(shè)計(jì)(3題,每題20分,共60分)1.題目(20分):美團(tuán)外賣在高峰期(如11:00-12:00)訂單量激增,請(qǐng)?jiān)O(shè)計(jì)一個(gè)分布式限流系統(tǒng),防止后端服務(wù)崩潰。要求支持預(yù)熱、削峰和降級(jí)策略。答案:方案:1.預(yù)熱階段:提前(如提前30分鐘)向緩存(Redis)預(yù)置令牌,按時(shí)間窗口(如每分鐘)分配。2.削峰階段:若流量超限,通過隊(duì)列(Kafka)暫存請(qǐng)求,后續(xù)異步處理。3.降級(jí)階段:當(dāng)系統(tǒng)負(fù)載過高時(shí),關(guān)閉非核心接口(如優(yōu)惠券領(lǐng)?。?,優(yōu)先保障核心路徑(如下單)。技術(shù)選型:-限流:Redis分布式鎖+令牌桶算法-異步處理:Kafka+車道隊(duì)列(如RabbitMQ)-監(jiān)控:Prometheus+Grafana解析:限流需兼顧平滑性和彈性。令牌桶算法可防突發(fā),Redis緩存高并發(fā)讀寫。削峰通過消息隊(duì)列平滑流量,降級(jí)需明確業(yè)務(wù)優(yōu)先級(jí)。美團(tuán)實(shí)際采用灰度發(fā)布和熔斷器(Hystrix)實(shí)現(xiàn)。2.題目(20分):設(shè)計(jì)美團(tuán)騎手分配系統(tǒng),要求在3秒內(nèi)為每個(gè)新訂單匹配最優(yōu)騎手。假設(shè)輸入為訂單位置、騎手實(shí)時(shí)位置和狀態(tài)。答案:方案:1.數(shù)據(jù)結(jié)構(gòu):-訂單:`{id,lat,lng,created_at}`-騎手:`{id,lat,lng,status,last_assigned_time}`2.核心算法:-使用R-tree索引(PostGIS)快速篩選附近騎手。-結(jié)合距離(曼哈頓距離)+等待時(shí)長(優(yōu)先未分配騎手)排序。3.優(yōu)化:-騎手狀態(tài)實(shí)時(shí)更新(WebSocket推送)。-冷啟動(dòng)優(yōu)化:新騎手優(yōu)先分配附近訂單。解析:高并發(fā)場景下需平衡精度和效率。R-tree適合地理空間查詢,但若騎手?jǐn)?shù)量極大(如百萬級(jí))需分層(如先按區(qū)域分配)。美團(tuán)實(shí)際采用多級(jí)調(diào)度:區(qū)域→網(wǎng)格→訂單分配。3.題目(20分):設(shè)計(jì)一個(gè)支持高并發(fā)的短鏈接系統(tǒng),要求在用戶訪問時(shí)能快速解析為原URL。假設(shè)每日請(qǐng)求量達(dá)百萬級(jí)。答案:方案:1.短鏈接生成:-使用62進(jìn)制(a-z,A-Z,0-9)+哈希算法(如SHA256)生成短碼。-緩存前綴(如`http://meituan.me/`)。2.解析流程:-HTTP請(qǐng)求命中本地緩存(Redis)。-若未命中,通過短碼查數(shù)據(jù)庫(分片表+索引)。3.性能優(yōu)化:-負(fù)載均衡(Nginx反向代理)。-數(shù)據(jù)庫預(yù)熱(定時(shí)加載熱點(diǎn)短碼)。解析:需解決高并發(fā)下的緩存穿透和雪崩問題。分片表(如按短碼首字母分表)可提升查詢效率。美團(tuán)實(shí)際使用Tengine+Redis+ShardingSphere實(shí)現(xiàn),并監(jiān)控短碼生成沖突率。三、數(shù)據(jù)庫與存儲(chǔ)(2題,每題15分,共30分)1.題目(15分):美團(tuán)外賣訂單表(`orders`)字段包括`order_id`(主鍵)、`user_id`、`total_amount`、`status`(如待支付、已支付)、`created_at`。請(qǐng)?jiān)O(shè)計(jì)索引策略以優(yōu)化以下查詢:1)篩選某用戶最近一個(gè)月的訂單。2)統(tǒng)計(jì)不同狀態(tài)的訂單數(shù)量。答案:索引設(shè)計(jì):1)`user_id+created_at`組合索引(左前綴原則):sqlCREATEINDEXidx_user_timeONorders(user_id,created_at);2)`status`單獨(dú)索引:sqlCREATEINDEXidx_statusONorders(status);解析:組合索引可同時(shí)加速范圍查詢和排序。美團(tuán)實(shí)際采用覆蓋索引(如`user_id+status+created_at`)進(jìn)一步減少掃描。注意避免冗余索引(如`status`已隱含在組合索引中)。2.題目(15分):設(shè)計(jì)美團(tuán)點(diǎn)評(píng)的評(píng)論存儲(chǔ)方案,要求支持:-用戶發(fā)布評(píng)論時(shí)實(shí)時(shí)更新對(duì)應(yīng)商戶的評(píng)分。-支持分頁查詢(如每頁10條)。答案:方案:1.數(shù)據(jù)表:sqlCREATETABLEcomments(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_id,merchant_id,rating,content,created_atDATETIMEDEFAULTCURRENT_TIMESTAMP,INDEXidx_merchant_rating(merchant_id,ratingDESC,created_atDESC));2.評(píng)分計(jì)算:-使用RedisLua腳本計(jì)算加權(quán)平均分(防刷分)。lualocaltotal,count=redis.call('HGETALL',KEYS[1]);total=tonumber(total)or0;count=tonumber(count)or0;returnmath.floor((total+rating)/(count+1)100)/100;3.分頁優(yōu)化:-MySQLLIMIT10+offset,但offset不適用于大數(shù)據(jù)量。-可改用`WHEREid>last_id`的游標(biāo)方式。解析:評(píng)分計(jì)算需原子性,RedisLua腳本可保證。分頁場景下offset效率低,美團(tuán)實(shí)際使用時(shí)間戳+ID范圍。商戶表需建立`merchant_id`索引以加速關(guān)聯(lián)查詢。四、分布式與中間件(2題,每題20分,共40分)1.題目(20分):美團(tuán)點(diǎn)評(píng)的秒殺活動(dòng)涉及庫存扣減,請(qǐng)?jiān)O(shè)計(jì)一個(gè)防超賣、高并發(fā)的庫存系統(tǒng)。要求支持分布式事務(wù)和異步補(bǔ)償。答案:方案:1.庫存表設(shè)計(jì):sqlCREATETABLEstock(product_id,stockINT,versionINT,INDEXidx_product(product_id));2.扣減邏輯:-分布式鎖(RedisSETNX+過期)。-使用CAS(Compare-And-Swap)更新庫存和version。3.異步補(bǔ)償:-若扣減失敗,消息隊(duì)列(RabbitMQ)記錄失敗訂單,定時(shí)重試。解析:超賣核心在于原子性,Redis鎖+CAS可避免。美團(tuán)實(shí)際采用Seata分布式事務(wù)框架(2PC)+補(bǔ)償任務(wù)。庫存表version字段用于樂觀鎖檢測。2.題目(20分):設(shè)計(jì)美團(tuán)外賣的實(shí)時(shí)推薦系統(tǒng),要求用戶打開App時(shí)在2秒內(nèi)展示個(gè)性化菜品。假設(shè)輸入為用戶歷史
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)衛(wèi)生宣教制度
- 衛(wèi)生室聯(lián)合用藥管理制度
- 鎮(zhèn)鄉(xiāng)中心校食品衛(wèi)生制度
- 小學(xué)德育衛(wèi)生制度
- 衛(wèi)生院信息反饋制度
- 衛(wèi)生站院感巡查制度
- 衛(wèi)生系統(tǒng)雙報(bào)告制度
- 鄉(xiāng)鎮(zhèn)衛(wèi)生院重精工作制度
- 熟制品衛(wèi)生管理制度
- 焊錫職衛(wèi)生管理制度
- 2023-2024學(xué)年廣東省茂名市高一(上)期末數(shù)學(xué)試卷(含答案)
- 《課堂管理的技巧》課件
- 醫(yī)院培訓(xùn)課件:《頸椎病》
- 佛山市離婚協(xié)議書范本
- HG+20231-2014化學(xué)工業(yè)建設(shè)項(xiàng)目試車規(guī)范
- 工地春節(jié)停工復(fù)工計(jì)劃安排方案
- 連接員題庫(全)題庫(855道)
- 單元學(xué)習(xí)項(xiàng)目序列化-選擇性必修下冊(cè)第三單元為例(主題匯報(bào)課件)-統(tǒng)編高中語文教材單元項(xiàng)目式序列化研究
- 黑布林英語漁夫和他的靈魂
- 電站組件清洗措施及方案
- 冀教版五年級(jí)英語下冊(cè)全冊(cè)同步練習(xí)一課一練
評(píng)論
0/150
提交評(píng)論