阿里巴程序員面試指南編程題目及答案詳解_第1頁(yè)
阿里巴程序員面試指南編程題目及答案詳解_第2頁(yè)
阿里巴程序員面試指南編程題目及答案詳解_第3頁(yè)
阿里巴程序員面試指南編程題目及答案詳解_第4頁(yè)
阿里巴程序員面試指南編程題目及答案詳解_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2026年阿里巴程序員面試指南:編程題目及答案詳解一、算法設(shè)計(jì)(共3題,每題15分)1.題目:給定一個(gè)非負(fù)整數(shù)數(shù)組`nums`,返回其中范圍在`[lower,upper]`之間的所有唯一整數(shù)對(duì)的數(shù)量。數(shù)組中的數(shù)字可能重復(fù),但只計(jì)算不同的整數(shù)對(duì)。例如,`nums=[1,1,2,2,3]`,`lower=2`,`upper=3`,唯一整數(shù)對(duì)為`(2,2)`和`(2,3)`,返回?cái)?shù)量為2。要求:-時(shí)間復(fù)雜度不超過`O(nlogn)`。-輸出數(shù)量,無(wú)需具體輸出對(duì)數(shù)。2.題目:實(shí)現(xiàn)一個(gè)`LRU緩存`(最近最少使用緩存)的`get`和`put`操作。`LRU緩存`支持以下操作:-`get(key)`:如果存在鍵`key`,返回其值,并將其設(shè)為最近最常使用;否則返回-1。-`put(key,value)`:如果`key`已存在,更新其值并設(shè)為最近最常使用;如果不存在,添加`key`并設(shè)為最近最常使用,如果緩存已滿,則刪除最近最少使用的項(xiàng)。要求:-使用哈希表和雙向鏈表實(shí)現(xiàn),時(shí)間復(fù)雜度為`O(1)`。-示例:pythonlru=LRUCache(2)lru.put(1,1)lru.put(2,2)lru.get(1)#返回1lru.put(3,3)#原本1應(yīng)被刪除,緩存變?yōu)閧2:2,3:3}lru.get(2)#返回-1(未找到)3.題目:給定一個(gè)字符串`s`,找到其中最長(zhǎng)的`平衡`子字符串。平衡子字符串指由兩個(gè)不同字符交替組成的子串,如`"ABAB"`或`"AABB"`。返回最長(zhǎng)平衡子字符串的長(zhǎng)度。要求:-時(shí)間復(fù)雜度為`O(n)`。-示例:pythons="AABBABABB"#最長(zhǎng)平衡子串為"AABBABAB",長(zhǎng)度為6二、系統(tǒng)設(shè)計(jì)(共2題,每題20分)1.題目:設(shè)計(jì)一個(gè)高并發(fā)的短鏈接系統(tǒng)。要求:-輸入長(zhǎng)URL,返回短URL(如`/abc123`)。-短URL需唯一且易于生成(如使用62進(jìn)制編碼)。-支持高并發(fā)訪問和快速跳轉(zhuǎn)回原URL。要求:-描述系統(tǒng)架構(gòu)(數(shù)據(jù)庫(kù)、緩存、負(fù)載均衡等)。-解釋如何保證唯一性和高可用性。2.題目:設(shè)計(jì)一個(gè)實(shí)時(shí)消息推送系統(tǒng)(如微信、抖音的即時(shí)消息)。要求:-支持百萬(wàn)級(jí)用戶,消息延遲不超過100ms。-實(shí)現(xiàn)用戶訂閱、消息推送和離線緩存功能。-描述關(guān)鍵組件(消息隊(duì)列、數(shù)據(jù)庫(kù)、推送服務(wù)等)及其作用。三、數(shù)據(jù)庫(kù)(共2題,每題15分)1.題目:設(shè)計(jì)一個(gè)電商訂單表`orders`,包含以下字段:-`order_id`(主鍵,自增),-`user_id`(用戶ID,關(guān)聯(lián)用戶表),-`product_id`(商品ID,關(guān)聯(lián)商品表),-`quantity`(數(shù)量),-`price`(單價(jià)),-`status`(訂單狀態(tài),如"待支付"、"已發(fā)貨"等),-`create_time`(創(chuàng)建時(shí)間)。要求:-說(shuō)明字段類型選擇(如`INT`、`VARCHAR`等)。-編寫SQL查詢:-查詢總銷售額按月分組。-查詢未支付訂單數(shù)按狀態(tài)分組。2.題目:實(shí)現(xiàn)分頁(yè)查詢優(yōu)化。假設(shè)有`users`表(`id`,`name`,`create_time`),編寫SQL查詢:sqlSELECTid,nameFROMusersORDERBYcreate_timeDESCLIMIT10OFFSET100;要求:-解釋`LIMIT`和`OFFSET`的效率問題。-提出優(yōu)化方案(如使用游標(biāo)、緩存熱門頁(yè)等)。四、代碼實(shí)現(xiàn)(共3題,每題10分)1.題目:實(shí)現(xiàn)一個(gè)`LruCache`的Python版本,支持`get`和`put`操作。2.題目:給定一個(gè)鏈表,反轉(zhuǎn)其前`k`個(gè)節(jié)點(diǎn)。例如:python輸入:1->2->3->4->5,k=2輸出:2->1->4->3->53.題目:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的LRU緩存,使用Python的`collections.OrderedDict`。答案與解析一、算法設(shè)計(jì)1.答案:思路:-排序數(shù)組,去重后使用雙指針法統(tǒng)計(jì)滿足`lower<=a+b<=upper`的對(duì)數(shù)。-時(shí)間復(fù)雜度:`O(nlogn)`(排序)+`O(n)`(雙指針)。代碼:pythondefcount_pairs(nums,lower,upper):nums=sorted(set(nums))n=len(nums)count=0left,right=0,0whileright<n:ifnums[left]+nums[right]<lower:right+=1elifnums[left]+nums[right]>upper:count+=n-rightleft+=1else:count+=n-rightleft+=1returncount//2解析:-排序去重后,雙指針`left`和`right`分別從左向右移動(dòng)。-當(dāng)`nums[left]+nums[right]`在范圍內(nèi)時(shí),所有`right`后面的數(shù)都滿足條件,因此`count+=n-right`。2.答案:思路:-使用哈希表記錄節(jié)點(diǎn),雙向鏈表維護(hù)最近使用順序。-`get`時(shí)移動(dòng)節(jié)點(diǎn)到鏈表頭部,`put`時(shí)判斷是否存在并更新位置。代碼:pythonclassNode:def__init__(self,key=0,value=0):self.key=keyself.value=valueself.prev=Noneself.next=NoneclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.head,self.tail=Node(),Node()self.head.next=self.tailself.tail.prev=self.headdef_remove(self,node):node.prev.next=node.nextnode.next.prev=node.prevdef_add(self,node):node.prev=self.headnode.next=self.head.nextself.head.next.prev=nodeself.head.next=nodedefget(self,key:int)->int:ifkeynotinself.cache:return-1node=self.cache[key]self._remove(node)self._add(node)returnnode.valuedefput(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:node=self.tail.prevself._remove(node)delself.cache[node.key]解析:-`head`和`tail`是哨兵節(jié)點(diǎn),簡(jiǎn)化插入和刪除操作。-`get`時(shí)移動(dòng)節(jié)點(diǎn)到頭部,`put`時(shí)先刪除舊節(jié)點(diǎn)(如果存在),再添加新節(jié)點(diǎn)。3.答案:思路:-使用狀態(tài)機(jī)判斷當(dāng)前字符與前一個(gè)字符是否交替。-用哈希表記錄每個(gè)狀態(tài)的出現(xiàn)位置,計(jì)算最長(zhǎng)交替子串。代碼:pythondeflongest_balanced_substring(s:str)->int:state={}max_len=0prev,prev_len=None,0fori,cinenumerate(s):ifprevisNoneorc!=prev:state[(prev,c)]=iprev,prev_len=c,1else:prev_len+=1if(prev,c)instate:max_len=max(max_len,i-state[(prev,c)])else:state[(prev,c)]=iprev,prev_len=c,1returnmax_len解析:-狀態(tài)`(prev,c)`表示前一個(gè)字符和當(dāng)前字符的組合。-如果遇到重復(fù)狀態(tài),更新最大長(zhǎng)度。二、系統(tǒng)設(shè)計(jì)1.答案:系統(tǒng)架構(gòu):1.URL編碼模塊:-使用62進(jìn)制(`a-z`,`A-Z`,`0-9`)將長(zhǎng)URL映射為短碼(如`abc123`)。-例如:`1000`→`a`,`1000+1`→`b`,循環(huán)到`z`后繼續(xù)`A-Z`。2.數(shù)據(jù)庫(kù):-使用哈希表存儲(chǔ)`short_code`→`long_url`,支持快速查找。-使用自增ID生成短碼,避免沖突。3.緩存:-高頻短URL緩存到Redis,減少數(shù)據(jù)庫(kù)訪問。4.負(fù)載均衡:-多臺(tái)節(jié)點(diǎn)處理請(qǐng)求,使用DNS輪詢或Nginx均衡。唯一性和高可用性:-短碼生成算法確保唯一性。-數(shù)據(jù)庫(kù)主從復(fù)制+讀寫分離保證高可用。2.答案:系統(tǒng)架構(gòu):1.消息隊(duì)列(Kafka/RabbitMQ):-消息異步發(fā)送,支持削峰填谷。2.數(shù)據(jù)庫(kù)(Redis/Memcached):-緩存用戶在線狀態(tài)和離線消息。3.推送服務(wù)(WebSocket/Server-SentEvents):-實(shí)時(shí)推送消息給客戶端。4.離線緩存:-用戶離線時(shí)保存消息,上線后補(bǔ)發(fā)。關(guān)鍵組件作用:-消息隊(duì)列解耦服務(wù),Redis緩存熱點(diǎn)數(shù)據(jù),推送服務(wù)實(shí)現(xiàn)實(shí)時(shí)通信。三、數(shù)據(jù)庫(kù)1.答案:表設(shè)計(jì):sqlCREATETABLEorders(order_idINTAUTO_INCREMENTPRIMARYKEY,user_idINTNOTNULL,product_idINTNOTNULL,quantityINTDEFAULT1,priceDECIMAL(10,2)NOTNULL,statusVARCHAR(20)DEFAULT'待支付',create_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,INDEXidx_status(status),INDEXidx_create_time(create_time));SQL查詢:sql--總銷售額按月分組SELECTDATE_FORMAT(create_time,'%Y-%m')ASmonth,SUM(quantityprice)AStotal_salesFROMordersWHEREstatus='已完成'GROUPBYmonthORDERBYmonth;--未支付訂單數(shù)按狀態(tài)分組SELECTstatus,COUNT()AScountFROMordersGROUPBYstatus;解析:-`DECIMAL`用于價(jià)格,避免浮點(diǎn)誤差。-索引`status`和`create_time`加速查詢。2.答案:優(yōu)化方案:-使用`id`索引:sqlSELECTid,nameFROMusersORDERBYidDESCLIMIT10OFFSET100;這樣MySQL可以利用索引跳過前100條。-緩存熱點(diǎn)頁(yè):sql--使用Redis緩存分頁(yè)結(jié)果SETusers_page_1JSON.stringify([result_list]);-避免大`OFFSET`:改用游標(biāo)(但需注意事務(wù)和鎖)。四、代碼實(shí)現(xiàn)1.答案:pythonfromcollectionsimportOrderedDictclassLRUCache:def__init__(self,capacity:int):self.cache=OrderedDict()self.capacity=capacitydefget(self,key:int)->int:ifkeynotinself.cache:return-1self.cache.move_to_end(key)returnself.cache[key]defput(self,key:int,value:int)->None:self.cache[key]=valueself.cache.move_to_end(key)iflen(self.cache)>self.capacity:self.cache.popitem(last=False)2.答案:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextdefreverse_k_group(head:ListNode,k:int)->ListNode:dummy=ListNode(0)dummy.next=headprev_group_end=dummywhileTrue:kth=get_kth_node(prev_group_end,k)ifnotkth:breakgroup_start=prev_group_end.nextnext_group_start=kth.nextprev,curr=kth.next,group_startwhilecurr!=next_group_start:tmp=curr.nextcurr.next=prevprev=currcurr

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論