互聯(lián)網(wǎng)公司CTO面試題_第1頁
互聯(lián)網(wǎng)公司CTO面試題_第2頁
互聯(lián)網(wǎng)公司CTO面試題_第3頁
互聯(lián)網(wǎng)公司CTO面試題_第4頁
互聯(lián)網(wǎng)公司CTO面試題_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2026年互聯(lián)網(wǎng)公司CTO面試題一、算法與數(shù)據(jù)結(jié)構(gòu)(共3題,每題10分,總分30分)1.題目:假設(shè)有一個(gè)無重復(fù)元素的整數(shù)數(shù)組`arr`,請?jiān)O(shè)計(jì)一個(gè)算法,找出數(shù)組中第三大的數(shù)。如果數(shù)組中的最大數(shù)、第二大數(shù)和第三大數(shù)都存在,則返回第三大的數(shù);否則,返回最大的數(shù)。例如:輸入:`[1,2,-2147483648]`,輸出:`1`。輸入:`[1,2,2,5,3,5]`,輸出:`2`。2.題目:實(shí)現(xiàn)一個(gè)LRU(LeastRecentlyUsed)緩存,支持`get`和`put`操作。緩存容量為`capacity`,當(dāng)訪問一個(gè)鍵時(shí),如果鍵存在,則返回其值,并將該鍵標(biāo)記為最近最常使用;如果鍵不存在,則返回`-1`。當(dāng)緩存容量已滿時(shí),需要?jiǎng)h除最久未使用的鍵以騰出空間。例如:LRU緩存容量為`2`:`put(1,1)`:緩存是`{1=1}``put(2,2)`:緩存是`{1=1,2=2}``get(1)`:返回`1`,緩存是`{2=2,1=1}`(最近最常用是1)`put(3,3)`:緩存容量已滿,刪除鍵`2`,緩存是`{1=1,3=3}``get(2)`:返回`-1`(鍵`2`已刪除)3.題目:給定一個(gè)鏈表,判斷鏈表是否存在環(huán)。如果存在環(huán),返回進(jìn)入環(huán)的節(jié)點(diǎn);否則,返回`null`。例如:輸入:`[3,2,0,-4]`,其中節(jié)點(diǎn)`0`的`next`指向節(jié)點(diǎn)`2`,輸出:節(jié)點(diǎn)`2`。輸入:`[1,2]`,節(jié)點(diǎn)`2`的`next`指向節(jié)點(diǎn)`1`,輸出:節(jié)點(diǎn)`1`。輸入:`[1]`,無環(huán),輸出:`null`。二、系統(tǒng)設(shè)計(jì)(共2題,每題15分,總分30分)1.題目:設(shè)計(jì)一個(gè)高并發(fā)的短鏈接生成系統(tǒng)。要求:-鏈接長度盡可能短(如`/abc123`)。-支持高并發(fā)訪問,單次請求響應(yīng)時(shí)間控制在`200ms`以內(nèi)。-鏈接唯一且可快速查重。-支持自定義短鏈接前綴(如`/abc123`)。2.題目:設(shè)計(jì)一個(gè)實(shí)時(shí)消息推送系統(tǒng)(如微信、釘釘)。要求:-支持億級用戶量,消息延遲不超過`100ms`。-支持離線推送,用戶上線后立即收到未讀消息。-支持消息分片(長消息自動拆分)。-支持消息簽收回執(zhí)和重試機(jī)制。三、數(shù)據(jù)庫與分布式(共3題,每題10分,總分30分)1.題目:假設(shè)一個(gè)電商平臺的訂單表`orders`,字段包括`order_id`(主鍵)、`user_id`、`order_time`、`total_amount`。設(shè)計(jì)以下場景的SQL查詢:-查詢最近`1小時(shí)`內(nèi),每個(gè)用戶的總消費(fèi)金額。-查詢`total_amount`超過`1000`的訂單中,`user_id`最多的前`10`個(gè)用戶。2.題目:解釋MySQL的`MVCC`(多版本并發(fā)控制)原理,并說明`REPEATABLEREAD`和`SERIALIZABLE`隔離級別下的快照讀和間隙鎖的區(qū)別。3.題目:設(shè)計(jì)一個(gè)分布式事務(wù)解決方案,要求:-支持至少`2`個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)一致性(如訂單和庫存)。-允許部分失敗,保證最終一致性。-考慮性能和可用性。四、中間件與緩存(共2題,每題15分,總分30分)1.題目:設(shè)計(jì)一個(gè)高可用的Redis集群方案,要求:-支持讀寫分離。-節(jié)點(diǎn)故障時(shí)自動切換。-數(shù)據(jù)分片策略(如哈希槽)。-考慮擴(kuò)容方案。2.題目:解釋Kafka的`ZooKeeper`依賴和`Broker`選舉機(jī)制。設(shè)計(jì)一個(gè)避免`Broker`單點(diǎn)的方案。五、網(wǎng)絡(luò)與安全(共2題,每題15分,總分30分)1.題目:假設(shè)你的系統(tǒng)需要防御DDoS攻擊,請?jiān)O(shè)計(jì)一套防護(hù)方案,包括:-基于IP的黑白名單。-WAF(Web應(yīng)用防火墻)策略。-流量清洗中心。2.題目:解釋HTTPS的握手過程,包括`TLS`版本選擇、證書校驗(yàn)、對稱密鑰生成等步驟。如何防止中間人攻擊?六、分布式與微服務(wù)(共2題,每題15分,總分30分)1.題目:設(shè)計(jì)一個(gè)分布式限流方案,要求:-支持按接口或用戶維度限流。-允許熱擴(kuò)展。-考慮漏桶和令牌桶算法的適用場景。2.題目:解釋SpringCloud的`Eureka`和`Consul`的區(qū)別,設(shè)計(jì)一個(gè)服務(wù)注冊與發(fā)現(xiàn)的容錯(cuò)方案。七、開放性問題(共1題,20分)題目:假設(shè)你要重構(gòu)一個(gè)十年以上的單體應(yīng)用,將其拆分為微服務(wù)架構(gòu)。請說明:-如何劃分服務(wù)邊界?-如何解決服務(wù)間的通信問題?-如何處理數(shù)據(jù)一致性?-如何保證系統(tǒng)的監(jiān)控和運(yùn)維復(fù)雜度可控?答案與解析一、算法與數(shù)據(jù)結(jié)構(gòu)1.第三大數(shù)思路:維護(hù)三個(gè)變量`first`、`second`、`third`,遍歷數(shù)組時(shí)更新這三個(gè)變量。代碼:pythondefthird_largest(nums):first,second,third=float('-inf'),float('-inf'),float('-inf')fornuminnums:ifnum>first:third,second,first=second,first,numeliffirst>num>second:third,second=second,numelifsecond>num>third:third=numreturnfirstifthird!=float('-inf')elsesecond解析:-如果`num`大于`first`,則更新所有三個(gè)變量。-如果`num`在`first`和`second`之間,則更新`second`和`third`。-否則,僅更新`third`。-最后,如果`third`仍為初始值,說明不存在第三大數(shù),返回`second`。2.LRU緩存思路:使用雙向鏈表+哈希表實(shí)現(xiàn)。鏈表頭為最近最常用,尾為最久未使用;哈希表`cache`存儲`key->node`映射。代碼:pythonclassDLinkedNode: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=DLinkedNode(),DLinkedNode()self.head.next=self.tailself.tail.prev=self.headdefget(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=DLinkedNode(key,value)self.cache[key]=nodeself._add(node)iflen(self.cache)>self.capacity:node=self.tail.prevself._remove(node)delself.cache[node.key]def_remove(self,node):delself.cache[node.key]node.prev.next=node.nextnode.next.prev=node.prevdef_add(self,node):node.next=self.head.nextnode.next.prev=nodeself.head.next=nodenode.prev=self.head解析:-`get`操作將節(jié)點(diǎn)移動到鏈表頭部,返回值。-`put`操作先刪除舊節(jié)點(diǎn),再添加新節(jié)點(diǎn)到頭部。如果超出容量,刪除尾部節(jié)點(diǎn)。-雙向鏈表保證`O(1)`的插入和刪除,哈希表保證`O(1)`的查詢單節(jié)點(diǎn)。3.鏈表環(huán)檢測思路:使用快慢指針(Floyd循環(huán)檢測算法)。代碼:pythondefdetect_cycle(head:ListNode)->ListNode:slow,fast=head,headwhilefastandfast.next:slow=slow.nextfast=fast.next.nextifslow==fast:slow=headwhileslow!=fast:slow=slow.nextfast=fast.nextreturnslowreturnNone解析:-快指針每次走兩步,慢指針走一步,相遇則存在環(huán)。-相遇后,慢指針從頭開始,快指針從相遇點(diǎn)開始,再次相遇的節(jié)點(diǎn)即為環(huán)的入口。-如果快指針到達(dá)`None`,則無環(huán)。二、系統(tǒng)設(shè)計(jì)1.短鏈接生成系統(tǒng)設(shè)計(jì):-使用`62`進(jìn)制編碼(`0-9`,`a-z`,`A-Z`),長度為`6`時(shí)約`2^36`種鏈接。-前綴自定義,后綴隨機(jī)生成。-數(shù)據(jù)存儲:`Redis`(緩存熱點(diǎn)鏈接)+`MySQL`(持久化)。-高并發(fā):使用`Redis`分布式鎖防止沖突。-接口:httpPOST/shortenBody:{url:"",prefix:"my"}Response:"/myabc123"解析:-`62`進(jìn)制編碼可縮短鏈接長度。-`Redis`緩存熱點(diǎn)數(shù)據(jù),`MySQL`存儲所有鏈接。-分布式鎖保證唯一性。2.實(shí)時(shí)消息推送系統(tǒng)設(shè)計(jì):-消息隊(duì)列:`Kafka`(高吞吐)。-推送服務(wù):`MQ`消費(fèi)者異步處理。-離線推送:用戶表記錄`offline_token`,推送失敗緩存消息。-分片:客戶端按`len=1024`拆分,服務(wù)端組裝。-簽收回執(zhí):`Redis`存儲`user->message_id`,服務(wù)端定期清理。解析:-`Kafka`保證消息可靠性。-離線推送需用戶在線狀態(tài)。三、數(shù)據(jù)庫與分布式1.SQL查詢最近1小時(shí)消費(fèi)金額:sqlSELECTuser_id,SUM(total_amount)AStotalFROMordersWHEREorder_time>NOW()-INTERVAL1HOURGROUPBYuser_id前10高消費(fèi)用戶:sqlSELECTuser_id,SUM(total_amount)AStotalFROMordersWHEREtotal_amount>1000GROUPBYuser_idORDERBYtotalDESCLIMIT10解析:-第一條查詢按用戶分組,時(shí)間過濾。-第二條查詢先過濾大訂單,再按用戶分組排序。2.MVCC與隔離級別MVCC原理:-數(shù)據(jù)庫為每個(gè)事務(wù)維護(hù)一個(gè)快照,基于`ReadView`確定可見性。-`REPEATABLEREAD`(讀已提交+間隙鎖):防止幻讀,但可能死鎖。-`SERIALIZABLE`(串行化):使用Next-Key鎖,完全隔離,但性能最低。解析:-`MVCC`通過版本控制避免寫沖突。-`SERIALIZABLE`最安全但開銷大。3.分布式事務(wù)方案:-使用`2PC`(兩階段提交)或`TCC`(補(bǔ)償事務(wù))。-`2PC`:協(xié)調(diào)者拉取所有參與者狀態(tài),決定提交或回滾。-`TCC`:每個(gè)服務(wù)實(shí)現(xiàn)`try`、`confirm`、`cancel`操作。解析:-`2PC`實(shí)現(xiàn)簡單但阻塞。-`TCC`靈活但代碼復(fù)雜。四、中間件與緩存1.Redis集群設(shè)計(jì):-使用`6`個(gè)`Master`節(jié)點(diǎn),每個(gè)`Master`負(fù)責(zé)`16384`個(gè)哈希槽。-集群配置:`RedisSentinel`監(jiān)控主從切換。-讀寫分離:客戶端通過`Proxy`路由讀請求。-擴(kuò)容:新增`Master`時(shí)重新分配槽。解析:-哈希槽避免單點(diǎn)故障。-`Sentinel`保證高可用。2.Kafka依賴與Broker選舉ZooKeeper依賴:-元數(shù)據(jù)存儲(`Broker`列表、分區(qū))。-Leader選舉。Broker選舉:-`Kafka`重啟時(shí),`ZooKeeper`選舉首個(gè)存活節(jié)點(diǎn)為`Controller`,再選舉分區(qū)`Leader`。防單點(diǎn):-使用`Quorum`機(jī)制(如`3`個(gè)`ZooKeeper`節(jié)點(diǎn))。解析:-`ZooKeeper`是Kafka的基石。-`Quorum`防止腦裂。五、網(wǎng)絡(luò)與安全1.DDoS防護(hù)方案-IP黑白名單:動態(tài)識別惡意IP。-WAF:防止`SQL注入`、`XSS`。-流量清洗中心:使用`Cloudflare`或自建清洗機(jī)房。解析:-多層防御提高容錯(cuò)性。2.HTTPS握手過程步驟:1.客戶端發(fā)送`ClientHello`(`TLS`版本、`CipherSuite`)。2.服務(wù)器響應(yīng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論