版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2026年互聯(lián)網(wǎng)公司程序員面試考核要點(diǎn)一、編程基礎(chǔ)與算法(共5題,每題10分,總分50分)1.題目:實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)正整數(shù)`n`,返回`n`的漢諾塔移動(dòng)步驟(用字符串表示,例如`"A->B"`)。假設(shè)有三根柱子`A`、`B`、`C`,初始所有盤(pán)子在`A`上,目標(biāo)是將所有盤(pán)子移動(dòng)到`C`上。答案與解析:pythondefhanoi(n,source,target,auxiliary):ifn==1:returnf"{source}->{target}"else:return(hanoi(n-1,source,auxiliary,target)+f"{source}->{target}"+hanoi(n-1,auxiliary,target,source))示例:n=3print(hanoi(3,'A','C','B'))輸出:A->B,A->C,B->C,A->B,A->C,B->C解析:漢諾塔問(wèn)題采用遞歸解法,核心思想是:1.將前`n-1`個(gè)盤(pán)子從`A`移動(dòng)到`B`(借助`C`);2.將第`n`個(gè)盤(pán)子從`A`移動(dòng)到`C`;3.將前`n-1`個(gè)盤(pán)子從`B`移動(dòng)到`C`(借助`A`)。時(shí)間復(fù)雜度`O(2^n)`,空間復(fù)雜度`O(n)`。2.題目:給定一個(gè)未排序的整數(shù)數(shù)組,返回其中第三大的數(shù)。如果數(shù)組不足三個(gè)數(shù),返回最大的數(shù)。答案與解析:pythondefthird_max(nums):first,second,third=float('-inf'),float('-inf'),float('-inf')fornuminnums:ifnum>first:first,second,third=num,first,secondeliffirst>num>second:second,third=num,secondelifsecond>num>third:third=numreturnthirdifthird!=float('-inf')elsefirst示例:[1,2,2,5,3,5]print(third_max([1,2,2,5,3,5]))#輸出:2解析:維護(hù)三個(gè)變量`first`、`second`、`third`記錄當(dāng)前前三大的數(shù),遍歷數(shù)組時(shí)更新。關(guān)鍵在于避免重復(fù)數(shù)字影響。3.題目:實(shí)現(xiàn)一個(gè)函數(shù),判斷一個(gè)鏈表是否為回文鏈表(例如`1->2->2->1`)。答案與解析:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextdefis_palindrome(head):ifnothead:returnTrueslow=fast=headstack=[]whilefastandfast.next:stack.append(slow.val)slow=slow.nextfast=fast.next.nextiffast:slow=slow.nextwhileslow:ifslow.val!=stack.pop():returnFalseslow=slow.nextreturnTrue示例:1->2->2->1node1=ListNode(1)node2=ListNode(2)node3=ListNode(2)node4=ListNode(1)node1.next=node2node2.next=node3node3.next=node4print(is_palindrome(node1))#輸出:True解析:1.使用快慢指針找到鏈表中間,同時(shí)將前半部分值壓棧;2.比較后半部分與棧頂值是否一致;時(shí)間復(fù)雜度`O(n)`,空間復(fù)雜度`O(n)`。4.題目:給定一個(gè)字符串`s`,找到最長(zhǎng)的回文子串(例如`s="babad"`,最長(zhǎng)回文子串為`"bab"`或`"aba"`)。答案與解析:pythondeflongest_palindrome(s):ifnots:return""start,end=0,0foriinrange(len(s)):len1=expand_from_center(s,i,i)len2=expand_from_center(s,i,i+1)max_len=max(len1,len2)ifmax_len>end-start:start=i-(max_len-1)//2end=i+max_len//2returns[start:end+1]defexpand_from_center(s,left,right):whileleft>=0andright<len(s)ands[left]==s[right]:left-=1right+=1returnright-left-1示例:"babad"print(longest_palindrome("babad"))#輸出:"bab"或"aba"解析:雙指針?lè)?,遍歷每個(gè)字符作為回文中心,向左右擴(kuò)展。時(shí)間復(fù)雜度`O(n^2)`,空間復(fù)雜度`O(1)`。5.題目:實(shí)現(xiàn)一個(gè)LRU(最近最少使用)緩存,支持`get`和`put`操作。答案與解析: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_key=self.order.pop(0)delself.cache[oldest_key]self.cache[key]=valueself.order.append(key)示例:capacity=2lru=LRUCache(2)lru.put(1,1)lru.put(2,2)print(lru.get(1))#輸出:1lru.put(3,3)#去除key=2print(lru.get(2))#輸出:-1解析:使用哈希表記錄緩存值,雙向鏈表記錄訪問(wèn)順序。`get`時(shí)移動(dòng)節(jié)點(diǎn)到隊(duì)尾,`put`時(shí)若超出容量則刪除最久未使用節(jié)點(diǎn)。二、系統(tǒng)設(shè)計(jì)(共3題,每題20分,總分60分)1.題目:設(shè)計(jì)一個(gè)高并發(fā)的短鏈接系統(tǒng)(例如`tinyurl`),要求支持秒級(jí)生成和查詢。答案與解析:核心組件:1.短鏈接生成:-使用62進(jìn)制(`a-z`、`A-Z`、`0-9`)將`ID`映射為短字符串;-`ID`可以是自增或哈希(如`MD5+hash`);-緩存生成映射表,減少數(shù)據(jù)庫(kù)查詢。2.分布式ID生成器(Snowflake算法):pythonimporttimeimportthreadingclassSnowflakeID:def__init__(self,worker_id,datacenter_id,sequence=0):self.worker_id=worker_idself.datacenter_id=datacenter_idself.sequence=sequenceself.last_timestamp=-1self.worker_id_bits=5self.datacenter_id_bits=5self.sequence_bits=12self.max_worker_id=-1^(-1<<self.worker_id_bits)self.max_datacenter_id=-1^(-1<<self.datacenter_id_bits)self.sequence_mask=-1^(-1<<self.sequence_bits)self.timestamp_left_shift=self.sequence_bits+self.worker_id_bits+self.datacenter_id_bitsself.worker_id_shift=self.sequence_bits+self.worker_id_bitsself.datacenter_id_shift=self.sequence_bitsdef_get_timestamp(self):returnint(time.time()1000)defnext_id(self):timestamp=self._get_timestamp()iftimestamp<self.last_timestamp:raiseException("Clockmovedbackwards.Refusingtogenerateid.")iftimestamp==self.last_timestamp:self.sequence=(self.sequence+1)&self.sequence_maskifself.sequence==0:timestamp=self._wait_next_millis(self.last_timestamp)else:self.sequence=0self.last_timestamp=timestampid=((timestamp<<self.timestamp_left_shift)|(self.datacenter_id<<self.datacenter_id_shift)|(self.worker_id<<self.worker_id_shift)|self.sequence)returniddef_wait_next_millis(self,last_timestamp):timestamp=self._get_timestamp()whiletimestamp<=last_timestamp:timestamp=self._get_timestamp()returntimestamp3.緩存層(Redis):-將短鏈接映射到長(zhǎng)鏈接,使用`hash`結(jié)構(gòu)存儲(chǔ);-設(shè)置過(guò)期時(shí)間(如1小時(shí)),減少數(shù)據(jù)庫(kù)壓力。4.數(shù)據(jù)庫(kù)(MySQL/MongoDB):-存儲(chǔ)所有短鏈接映射關(guān)系,支持高并發(fā)讀寫(xiě);-索引`short_url`字段,加速查詢。高并發(fā)優(yōu)化:-CDN加速:將短鏈接解析服務(wù)部署在CDN節(jié)點(diǎn),減少延遲;-負(fù)載均衡:多副本服務(wù),通過(guò)`RoundRobin`或`LeastConnections`分配請(qǐng)求;-限流降級(jí):使用令牌桶算法限流,熔斷機(jī)制防止雪崩。2.題目:設(shè)計(jì)一個(gè)微博系統(tǒng),要求支持實(shí)時(shí)發(fā)布、關(guān)注、動(dòng)態(tài)刷新(如`/home`頁(yè)面)。答案與解析:核心組件:1.數(shù)據(jù)存儲(chǔ):-動(dòng)態(tài):MySQL(InnoDB)存儲(chǔ)`id`、`user_id`、`content`、`created_at`等;-索引:`user_id`(關(guān)注者關(guān)聯(lián))、`created_at`(時(shí)間排序);-全文索引:加速內(nèi)容搜索。2.實(shí)時(shí)發(fā)布(Kafka+Flink):-用戶發(fā)布動(dòng)態(tài)時(shí),消息推送到Kafka;-Flink消費(fèi)消息并寫(xiě)入MySQL,同時(shí)觸發(fā)緩存更新。3.關(guān)注系統(tǒng):-關(guān)系存儲(chǔ):MySQL表`follows`(`follower_id`、`followee_id`);-緩存:Redis存儲(chǔ)`user_id`關(guān)注列表,`O(1)`查詢。4.動(dòng)態(tài)刷新(WebSocket+WebSocket-Server):-用戶連接WebSocket長(zhǎng)連接;-服務(wù)端通過(guò)`RedisPub/Sub`廣播最新動(dòng)態(tài);-消息體包含`user_id`、`動(dòng)態(tài)內(nèi)容`,客戶端按需更新。5.分頁(yè)加載:-`/home`接口支持`limit`和`offset`;-MySQL查詢時(shí)使用`ORDERBYcreated_atDESCLIMIT20`;-加載更多時(shí),請(qǐng)求`/home?offset=20`。高并發(fā)優(yōu)化:-消息隊(duì)列削峰:Kafka緩沖請(qǐng)求,防數(shù)據(jù)庫(kù)過(guò)載;-本地緩存:用戶動(dòng)態(tài)先查詢Redis,命中則返回;-異步更新:動(dòng)態(tài)更新關(guān)注者列表時(shí),使用Celery隊(duì)列處理。3.題目:設(shè)計(jì)一個(gè)高并發(fā)的秒殺系統(tǒng),要求支持排隊(duì)、防刷單、秒殺成功回調(diào)。答案與解析:核心組件:1.排隊(duì)系統(tǒng)(Redis):-用戶請(qǐng)求時(shí),使用`INCR`和`LPUSH`將`user_id`加入隊(duì)列;-`EXPIRE`設(shè)置過(guò)期時(shí)間(如5秒),防止僵尸請(qǐng)求。pythondefenqueue(user_id,queue_key="sekai_queue"):redis.incr(queue_key)redis.lpush(queue_key,user_id)redis.expire(queue_key,5)2.庫(kù)存扣減(Redis+Lua):-使用Lua腳本原子性執(zhí)行:lualocalstock=redis.call("get",KEYS[1])ifstock>tonumber(ARGV[1])thenredis.call("decr",KEYS[1],ARGV[1])return1elsereturn0end-鎖定庫(kù)存時(shí),`SETNX`防止并發(fā)扣減。3.防刷單(風(fēng)控系統(tǒng)):-IP頻率限制:Redis記錄`ip:count`,超過(guò)閾值攔截;-設(shè)備限制:`device_id:count`;-行為分析:用戶登錄、驗(yàn)證碼等驗(yàn)證。4.秒殺成功回調(diào)(消息隊(duì)列):-成功秒殺后,消息推送到RabbitMQ;-消費(fèi)者處理訂單生成、庫(kù)存回滾等。高并發(fā)優(yōu)化:-分布式鎖:使用Redis`SETNX`防止超賣;-異步通知:秒殺成功后,通過(guò)WebSocket推送結(jié)果;-灰度發(fā)布:小流量測(cè)試,逐步擴(kuò)容。三、數(shù)據(jù)庫(kù)與存儲(chǔ)(共2題,每題15分,總分30分)1.題目:設(shè)計(jì)一個(gè)支持高并發(fā)的訂單表,要求支持訂單創(chuàng)建、查詢、支付狀態(tài)更新。答案與解析:表結(jié)構(gòu):sqlCREATETABLEorders(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINTNOTNULL,product_idBIGINTNOTNULL,amountDECIMAL(10,2)NOTNULL,statusENUM('pending','paid','cancelled')DEFAULT'pending',created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,INDEXidx_user(user_id),INDEXidx_product(product_id),INDEXidx_status(status));高并發(fā)優(yōu)化:1.事務(wù)隔離級(jí)別:-使用`REPEATABLEREAD`(InnoDB默認(rèn)),防止臟讀;-支付更新時(shí),使用`SELECT...FORUPDATE`鎖定行。2.樂(lè)觀鎖:-在`status`字段增加版本號(hào)`version`,更新時(shí)檢查版本是否一致。sqlUPDATEordersSETstatus='paid',version=version+1WHEREid=123ANDversion=2;3.緩存:-使用Redis緩存訂單詳情,`EXPIRE`設(shè)置5分鐘;-支付成功后,通過(guò)`Pub/Sub`更新緩存。4.分庫(kù)分表:-按用戶ID哈希分表,避免單表過(guò)大;-使用ShardingSphere或Tars進(jìn)行路由。2.題目:設(shè)計(jì)一個(gè)存儲(chǔ)用戶文件的系統(tǒng),要求支持上傳、下載、過(guò)期刪除。答案與解析:核心組件:1.文件存儲(chǔ)(MinIO+S3):-對(duì)象存儲(chǔ)存儲(chǔ)文件,支持高并發(fā)訪問(wèn);-元數(shù)據(jù)存儲(chǔ)在MySQL(`file_id`、`user_id`、`path`)。2.上傳流程:-用戶上傳文件時(shí),生成`file_id`(UUID);-MinIO接收文件,MySQL插入記錄;-緩存`file_id`與`path`映射。3.下載流程:-查詢Redis緩存`file_id`路徑,命中則直接返回;-未命中則查詢MySQL,返回MinIO路徑。4.過(guò)期刪除:-MySQL記錄`expired_at`,每天定時(shí)任務(wù)清理過(guò)期文件;-MinIO生命周期策略(如30天自動(dòng)刪除)。高并發(fā)優(yōu)化:-CDN加速:文件上傳后同步到CDN,減少下載延遲;-并發(fā)上傳:使用`multipartupload`分片上傳,合并后保存;-緩存預(yù)熱:大文件上傳后,提前緩存CDN路徑。四、網(wǎng)絡(luò)與系統(tǒng)(共3題,每題10分,總分30分)1.題目:解釋HTTP/2與HTTP/1.1的主要區(qū)別,并說(shuō)明為何HTTP/2更適合微服務(wù)架構(gòu)。答案與解析:HTTP/2改進(jìn):1.多路復(fù)用:允許多個(gè)請(qǐng)求/響應(yīng)并行傳輸,避免隊(duì)頭阻塞;2.頭部壓縮:使用HPACK算法減少重復(fù)頭部傳輸;3.服務(wù)器推送:動(dòng)態(tài)請(qǐng)求前主動(dòng)推送資源(如JavaScript)。微服務(wù)優(yōu)勢(shì):-減少請(qǐng)求次數(shù):推送API接口可合并為單次傳輸;-低延遲:
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年數(shù)字孿生 航空發(fā)動(dòng)機(jī)運(yùn)維項(xiàng)目建議書(shū)
- 2025年數(shù)字媒體藝術(shù)專業(yè)考試試題及答案
- 2025年健康管理師(三級(jí))理論知識(shí)練習(xí)題及答案
- 2025年農(nóng)村小學(xué)校長(zhǎng)年度工作總結(jié)
- 求職面試英語(yǔ)拼寫(xiě)技巧
- 爬蟲(chóng)數(shù)據(jù)采集技術(shù)介紹
- 醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理規(guī)范培訓(xùn)試題及答案
- 手術(shù)室考試題庫(kù)及答案
- 2026中醫(yī)護(hù)理常規(guī)試題及答案
- 講故事比賽活動(dòng)方案
- 湖南省2025-2026學(xué)年七年級(jí)歷史上學(xué)期期末復(fù)習(xí)試卷(含答案)
- 2026新疆阿合奇縣公益性崗位(鄉(xiāng)村振興專干)招聘44人考試參考試題及答案解析
- 紡織倉(cāng)庫(kù)消防安全培訓(xùn)
- 器官移植術(shù)后排斥反應(yīng)的風(fēng)險(xiǎn)分層管理
- 虛擬電廠關(guān)鍵技術(shù)
- 事業(yè)單位清算及財(cái)務(wù)報(bào)告編寫(xiě)范本
- 企業(yè)盡職調(diào)查內(nèi)容提綱-中英文對(duì)照
- 部編語(yǔ)文三年級(jí)上課文重點(diǎn)總復(fù)習(xí)歸納課件
- 物料提升機(jī)保養(yǎng)記錄表
- 中華系列期刊目錄
- 馬口鐵空罐檢驗(yàn)標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論