2026年京東后端開發(fā)面試題集_第1頁
2026年京東后端開發(fā)面試題集_第2頁
2026年京東后端開發(fā)面試題集_第3頁
2026年京東后端開發(fā)面試題集_第4頁
2026年京東后端開發(fā)面試題集_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2026年京東后端開發(fā)面試題集一、編程基礎(chǔ)與算法(共5題,每題10分,總分50分)題目1:字符串反轉(zhuǎn)題目描述:編寫一個函數(shù),將輸入的字符串反轉(zhuǎn)。例如,輸入"abcdef",輸出"fedcba"。答案:javapublicStringreverseString(Strings){if(s==null||s.length()<=1){returns;}char[]chars=s.toCharArray();intleft=0,right=chars.length-1;while(left<right){chartemp=chars[left];chars[left]=chars[right];chars[right]=temp;left++;right--;}returnnewString(chars);}解析:采用雙指針法,從字符串兩端向中間遍歷,交換字符位置。時間復(fù)雜度O(n),空間復(fù)雜度O(1)。題目2:查找最長不重復(fù)子串題目描述:給定一個字符串,找出其中最長的不重復(fù)子串,并返回其長度。例如,輸入"abcabcbb",輸出3(對應(yīng)子串"abc")。答案:javapublicintlengthOfLongestSubstring(Strings){if(s==null||s.length()==0)return0;int[]charIndex=newint[128];Arrays.fill(charIndex,-1);intmaxLength=0;intstart=0;for(inti=0;i<s.length();i++){charc=s.charAt(i);if(charIndex[c]>=start){start=charIndex[c]+1;}charIndex[c]=i;maxLength=Math.max(maxLength,i-start+1);}returnmaxLength;}解析:使用哈希表記錄字符上一次出現(xiàn)的位置,維護(hù)一個滑動窗口的起始位置。當(dāng)遇到重復(fù)字符時,更新窗口起始位置。時間復(fù)雜度O(n),空間復(fù)雜度O(1)。題目3:二叉樹遍歷題目描述:實(shí)現(xiàn)二叉樹的深度優(yōu)先遍歷(前序、中序、后序)和非遞歸遍歷。答案:java//定義二叉樹節(jié)點(diǎn)classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx){val=x;}}//前序遍歷(遞歸)publicvoidpreorderTraversal(TreeNoderoot){if(root==null)return;System.out.print(root.val+"");preorderTraversal(root.left);preorderTraversal(root.right);}//中序遍歷(遞歸)publicvoidinorderTraversal(TreeNoderoot){if(root==null)return;inorderTraversal(root.left);System.out.print(root.val+"");inorderTraversal(root.right);}//后序遍歷(遞歸)publicvoidpostorderTraversal(TreeNoderoot){if(root==null)return;postorderTraversal(root.left);postorderTraversal(root.right);System.out.print(root.val+"");}//前序遍歷(非遞歸)publicvoidpreorderTraversalIterative(TreeNoderoot){if(root==null)return;Stack<TreeNode>stack=newStack<>();stack.push(root);while(!stack.isEmpty()){TreeNodenode=stack.pop();System.out.print(node.val+"");if(node.right!=null)stack.push(node.right);if(node.left!=null)stack.push(node.left);}}解析:遞歸遍歷只需按照前序/中序/后序的順序訪問節(jié)點(diǎn)。非遞歸遍歷使用棧實(shí)現(xiàn),前序遍歷先訪問節(jié)點(diǎn),再右后左;中序遍歷先左后節(jié)點(diǎn)再右;后序遍歷先左后右再節(jié)點(diǎn)。題目4:TopK問題題目描述:給定一個包含n個元素的數(shù)組,找出其中出現(xiàn)次數(shù)最多的k個元素。例如,輸入數(shù)組[1,1,1,2,2,3],k=2,輸出[1,2]。答案:javaimportjava.util.;publicList<Integer>topKFrequent(int[]nums,intk){//統(tǒng)計每個元素出現(xiàn)的次數(shù)Map<Integer,Integer>frequencyMap=newHashMap<>();for(intnum:nums){frequencyMap.put(num,frequencyMap.getOrDefault(num,0)+1);}//創(chuàng)建大小為k的最小堆PriorityQueue<Map.Entry<Integer,Integer>>minHeap=newPriorityQueue<>((a,b)->a.getValue()-b.getValue());for(Map.Entry<Integer,Integer>entry:frequencyMap.entrySet()){if(minHeap.size()<k){minHeap.offer(entry);}elseif(entry.getValue()>minHeap.peek().getValue()){minHeap.poll();minHeap.offer(entry);}}//提取結(jié)果List<Integer>result=newArrayList<>();while(!minHeap.isEmpty()){result.add(minHeap.poll().getKey());}//反轉(zhuǎn)結(jié)果為降序Collections.reverse(result);returnresult;}解析:使用哈希表統(tǒng)計元素頻率,然后使用大小為k的最小堆維護(hù)頻率最高的k個元素。每次插入時比較堆頂元素,如果當(dāng)前元素頻率更高則替換。時間復(fù)雜度O(nlogk),空間復(fù)雜度O(n)。題目5:LRU緩存機(jī)制題目描述:設(shè)計LRU(LeastRecentlyUsed)緩存機(jī)制,支持get和put操作。當(dāng)緩存滿時,淘汰最久未使用的元素。答案:javaimportjava.util.;publicclassLRUCache{privateintcapacity;privateMap<Integer,Integer>cache;privateDeque<Integer>deque;publicLRUCache(intcapacity){this.capacity=capacity;cache=newHashMap<>();deque=newLinkedList<>();}publicintget(intkey){if(!cache.containsKey(key)){return-1;}//將訪問的元素移動到隊列頭部deque.remove(key);deque.offerFirst(key);returncache.get(key);}publicvoidput(intkey,intvalue){if(cache.containsKey(key)){//更新值并移動到隊列頭部cache.put(key,value);deque.remove(key);deque.offerFirst(key);}else{if(cache.size()==capacity){//緩存滿,淘汰最久未使用的元素intoldest=deque.pollLast();cache.remove(oldest);}//添加新元素到隊列頭部cache.put(key,value);deque.offerFirst(key);}}}解析:使用雙向隊列維護(hù)元素的訪問順序,哈希表實(shí)現(xiàn)O(1)時間復(fù)雜度的get和put操作。get時將元素移動到隊列頭部,put時如果緩存已滿則移除隊列尾部元素。時間復(fù)雜度O(1),空間復(fù)雜度O(capacity)。二、數(shù)據(jù)庫與SQL(共4題,每題12分,總分48分)題目1:數(shù)據(jù)庫設(shè)計題目描述:設(shè)計一個簡單的電商訂單系統(tǒng)數(shù)據(jù)庫表結(jié)構(gòu),包含用戶表、商品表、訂單表、訂單項表。要求:1.用戶表包含用戶ID、用戶名、注冊時間2.商品表包含商品ID、商品名稱、價格、庫存3.訂單表包含訂單ID、用戶ID、創(chuàng)建時間、總金額4.訂單項表包含訂單項ID、訂單ID、商品ID、數(shù)量、單價5.滿足關(guān)系約束和索引需求答案:sql--用戶表CREATETABLEusers(user_idINTPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(50)NOTNULLUNIQUE,registration_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP);--商品表CREATETABLEproducts(product_idINTPRIMARYKEYAUTO_INCREMENT,product_nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULL,stockINTNOTNULLCHECK(stock>=0));--訂單表CREATETABLEorders(order_idINTPRIMARYKEYAUTO_INCREMENT,user_idINTNOTNULL,created_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,total_amountDECIMAL(10,2)NOTNULL,FOREIGNKEY(user_id)REFERENCESusers(user_id));--訂單項表CREATETABLEorder_items(item_idINTPRIMARYKEYAUTO_INCREMENT,order_idINTNOTNULL,product_idINTNOTNULL,quantityINTNOTNULLCHECK(quantity>0),priceDECIMAL(10,2)NOTNULL,FOREIGNKEY(order_id)REFERENCESorders(order_id),FOREIGNKEY(product_id)REFERENCESproducts(product_id));--索引優(yōu)化CREATEINDEXidx_userONorders(user_id);CREATEINDEXidx_productONorder_items(product_id);CREATEINDEXidx_orderONorder_items(order_id);解析:設(shè)計符合第三范式,每個表有明確的主鍵和外鍵約束。用戶表和商品表設(shè)置唯一索引。訂單表和訂單項表設(shè)置外鍵約束。創(chuàng)建索引提高查詢效率,特別是訂單和訂單項的關(guān)聯(lián)查詢。題目2:復(fù)雜SQL查詢題目描述:給定以下表結(jié)構(gòu),編寫SQL查詢:1.查詢2025年每個用戶的訂單數(shù)量和總消費(fèi)金額2.查詢庫存低于10的商品列表及其最低訂單價格3.查詢至少購買了3個不同商品的用戶列表答案:sql--1.查詢2025年每個用戶的訂單數(shù)量和總消費(fèi)金額SELECTo.user_id,COUNT(o.order_id)ASorder_count,SUM(oi.quantityoi.price)AStotal_spentFROMordersoJOINorder_itemsoiONo.order_id=oi.order_idWHEREYEAR(o.created_time)=2025GROUPBYo.user_id;--2.查詢庫存低于10的商品列表及其最低訂單價格SELECTduct_id,duct_name,MIN(oi.price)ASmin_order_priceFROMproductspJOINorder_itemsoiONduct_id=duct_idWHEREp.stock<10GROUPBYduct_id,duct_name;--3.查詢至少購買了3個不同商品的用戶列表SELECTo.user_idFROMordersoJOINorder_itemsoiONo.order_id=oi.order_idGROUPBYo.user_idHAVINGCOUNT(DISTINCTduct_id)>=3;解析:第一個查詢使用JOIN連接訂單和訂單項,按年份分組統(tǒng)計。第二個查詢找出庫存低的商品,并計算每個商品的最低訂單價格。第三個查詢使用GROUPBY和HAVING統(tǒng)計每個用戶購買的不同商品數(shù)量。題目3:數(shù)據(jù)庫性能優(yōu)化題目描述:假設(shè)以下SQL查詢執(zhí)行緩慢:sqlSELECTFROMordersWHEREuser_id=?ANDcreated_timeBETWEEN?AND?請分析可能的原因并提出優(yōu)化方案。答案:可能原因:1.缺乏索引:orders表的user_id和created_time字段沒有復(fù)合索引2.數(shù)據(jù)量過大:orders表數(shù)據(jù)量超過百萬,全表掃描效率低3.索引選擇性不足:user_id的值分布不均,導(dǎo)致索引效率低4.系統(tǒng)資源限制:CPU、內(nèi)存或I/O資源不足優(yōu)化方案:1.創(chuàng)建復(fù)合索引sqlCREATEINDEXidx_user_timeONorders(user_id,created_time);2.分析數(shù)據(jù)分布,考慮分區(qū)表sqlCREATETABLEorders(order_idINTPRIMARYKEY,user_idINTNOTNULL,created_timeTIMESTAMPNOTNULL,total_amountDECIMAL(10,2))PARTITIONBYRANGE(YEAR(created_time))(PARTITIONp2020VALUESLESSTHAN(2021),PARTITIONp2021VALUESLESSTHAN(2022),...);3.使用EXPLAIN分析查詢計劃,優(yōu)化WHERE條件順序4.考慮使用緩存層(Redis)存儲熱點(diǎn)數(shù)據(jù)5.按需調(diào)整數(shù)據(jù)庫參數(shù)(如work_mem、bufferpoolsize)解析:分析查詢慢的原因應(yīng)從索引、數(shù)據(jù)量、數(shù)據(jù)分布和系統(tǒng)資源等方面入手。創(chuàng)建合適的索引是最直接的優(yōu)化方式,特別是對于范圍查詢和篩選查詢的復(fù)合索引。分區(qū)表可以大幅提高大數(shù)據(jù)量查詢的效率。題目4:數(shù)據(jù)庫事務(wù)題目描述:設(shè)計一個處理電商訂單的數(shù)據(jù)庫事務(wù),包含以下步驟:1.檢查商品庫存是否足夠2.扣除商品庫存3.創(chuàng)建訂單4.添加訂單項5.如果任何步驟失敗,需要回滾所有操作答案:sqlSTARTTRANSACTION;--1.檢查商品庫存SELECTstockFROMproductsWHEREproduct_id=?FORUPDATE;--2.扣除商品庫存UPDATEproductsSETstock=stock-?WHEREproduct_id=?;--3.創(chuàng)建訂單INSERTINTOorders(user_id,created_time,total_amount)VALUES(?,NOW(),?);--獲取訂單IDSET@order_id=LAST_INSERT_ID();--4.添加訂單項INSERTINTOorder_items(order_id,product_id,quantity,price)VALUES(?,?,?,?);--提交事務(wù)COMMIT;異常處理:sql--如果任何步驟失敗,回滾事務(wù)ROLLBACK;解析:使用事務(wù)保證操作的原子性。使用FORUPDATE鎖定庫存記錄,防止超賣。通過事務(wù)控制將扣庫存和創(chuàng)建訂單的操作綁定在一起。如果中間步驟失敗,整個事務(wù)回滾,保證數(shù)據(jù)一致性。注意在Java代碼中需要處理MySQL事務(wù)的異常。三、系統(tǒng)設(shè)計(共4題,每題15分,總分60分)題目1:秒殺系統(tǒng)設(shè)計題目描述:設(shè)計一個支持10萬并發(fā)用戶的秒殺系統(tǒng),要求:1.每秒處理至少1萬次請求2.防止超賣和重復(fù)購買3.響應(yīng)時間控制在500ms內(nèi)4.系統(tǒng)需支持水平擴(kuò)展答案:系統(tǒng)架構(gòu):1.接入層:Nginx集群+負(fù)載均衡,實(shí)現(xiàn)請求分發(fā)和靜態(tài)資源服務(wù)2.API網(wǎng)關(guān):SpringCloudGateway,路由轉(zhuǎn)發(fā)、熔斷限流3.秒殺服務(wù):無狀態(tài)微服務(wù),基于Redis實(shí)現(xiàn)分布式鎖4.庫存服務(wù):獨(dú)立微服務(wù),使用Redisson實(shí)現(xiàn)分布式鎖5.消息隊列:Kafka,處理異步訂單創(chuàng)建6.數(shù)據(jù)庫:分庫分表,使用MySQLCluster或TiDB核心流程:1.用戶請求先經(jīng)過Nginx負(fù)載均衡2.API網(wǎng)關(guān)限流并路由到秒殺服務(wù)3.秒殺服務(wù):-查詢Redis分布式鎖-獲取鎖后檢查庫存-庫存足夠則扣減庫存并記錄訂單-解鎖并返回結(jié)果4.成功請求通過Kafka發(fā)送到訂單服務(wù)異步創(chuàng)建訂單技術(shù)選型:-緩存:Redis(熱點(diǎn)數(shù)據(jù)緩存、分布式鎖)-鎖機(jī)制:Redisson分布式鎖-異步處理:Kafka+RabbitMQ-數(shù)據(jù)庫:分庫分表,讀寫分離-緩存預(yù)熱:啟動時預(yù)加載商品信息到Redis擴(kuò)展性:-水平擴(kuò)展:增加服務(wù)實(shí)例,Nginx自動負(fù)載均衡-垂直擴(kuò)展:提升服務(wù)器配置-數(shù)據(jù)庫擴(kuò)展:分片、讀寫分離-異步化:將非核心業(yè)務(wù)(訂單創(chuàng)建)異步處理解析:秒殺系統(tǒng)設(shè)計重點(diǎn)在于高并發(fā)處理、防止超賣和系統(tǒng)擴(kuò)展性。采用分布式鎖確保庫存一致性,通過異步處理提高吞吐量。系統(tǒng)架構(gòu)應(yīng)分離核心業(yè)務(wù),便于水平擴(kuò)展。使用Redis緩存熱點(diǎn)數(shù)據(jù),減少數(shù)據(jù)庫壓力。題目2:分布式事務(wù)解決方案題目描述:設(shè)計一個支持分布式事務(wù)的訂單支付系統(tǒng),包含訂單服務(wù)、支付服務(wù)、庫存服務(wù)。要求:1.確保支付成功后訂單狀態(tài)更新2.支持超時補(bǔ)償和事務(wù)回滾3.系統(tǒng)需支持高并發(fā)答案:方案選擇:采用2PC(兩階段提交)或TCC(Try-Confirm-Cancel)模式,結(jié)合本地消息表實(shí)現(xiàn)補(bǔ)償事務(wù)。架構(gòu)設(shè)計:1.事務(wù)協(xié)調(diào)者:訂單服務(wù),負(fù)責(zé)協(xié)調(diào)所有參與者2.參與者服務(wù):-支付服務(wù):處理支付請求-庫存服務(wù):扣減庫存-支付服務(wù):更新訂單狀態(tài)核心流程:2PC方案:1.準(zhǔn)備階段:-訂單服務(wù)發(fā)起事務(wù),標(biāo)記為預(yù)備狀態(tài)-通知所有參與者執(zhí)行本地事務(wù),并回復(fù)成功/失敗-如果所有參與者都成功,則提交事務(wù)-如果任何參與者失敗,則中止事務(wù)TCC方案:1.Try階段:-訂單服務(wù)調(diào)用各服務(wù)Try接口,預(yù)留資源-支付服務(wù)預(yù)留支付額度-庫存服務(wù)預(yù)留庫存-返回預(yù)留結(jié)果2.Confirm階段:-如果所有Try成功,則調(diào)用Confirm接口-支付服務(wù)確認(rèn)支付-庫存服務(wù)確認(rèn)庫存扣減-訂單服務(wù)更新狀態(tài)3.Cancel階段:-如果任何環(huán)節(jié)失敗,調(diào)用Cancel接口-支付服務(wù)撤銷支付-庫存服務(wù)恢復(fù)庫存本地消息表:-訂單服務(wù)記錄所有待處理消息-使用定時任務(wù)掃描未確認(rèn)消息-對于失敗消息,啟動補(bǔ)償事務(wù)進(jìn)行回滾技術(shù)選型:-分布式事務(wù)框架:Seata或Saga-消息隊列:Kafka用于事務(wù)消息傳遞-緩存:Redis存儲臨時狀態(tài)-數(shù)據(jù)庫:事務(wù)型數(shù)據(jù)庫優(yōu)化:-使用異步化設(shè)計減少阻塞-設(shè)置事務(wù)超時時間-狀態(tài)機(jī)管理事務(wù)狀態(tài)-異步補(bǔ)償機(jī)制解析:分布式事務(wù)解決方案需要平衡強(qiáng)一致性和系統(tǒng)性能。2PC方案實(shí)現(xiàn)簡單但性能較差,適合金融場景;TCC方案更靈活但實(shí)現(xiàn)復(fù)雜。本地消息表是實(shí)現(xiàn)最終一致性的重要手段。系統(tǒng)設(shè)計應(yīng)考慮超時補(bǔ)償和異步化,提高系統(tǒng)可用性。題目3:緩存架構(gòu)設(shè)計題目描述:設(shè)計一個支持百萬級用戶的電商系統(tǒng)緩存架構(gòu),要求:1.緩存命中率>95%2.緩存響應(yīng)時間<100ms3.支持緩存雪崩和熱點(diǎn)數(shù)據(jù)保護(hù)4.系統(tǒng)需支持故障轉(zhuǎn)移答案:分層緩存架構(gòu):1.分布式緩存層:Redis集群(主從復(fù)制+哨兵/集群模式)-數(shù)據(jù)類型:Hash、List、Set、ZSet-用途:商品信息、用戶信息、訂單緩存-容量:每個節(jié)點(diǎn)32GB以上2.本地緩存層:GuavaCache或EHCache-用途:高頻訪問數(shù)據(jù)、熱點(diǎn)數(shù)據(jù)-容量:每個服務(wù)實(shí)例10-50MB3.數(shù)據(jù)庫緩存:MySQLQueryCache(如果使用)-用途:SQL查詢結(jié)果緩存緩存策略:1.緩存預(yù)熱:-啟動時預(yù)加載熱點(diǎn)數(shù)據(jù)到Redis-使用定時任務(wù)補(bǔ)充緩存2.緩存穿透:-使用布隆過濾器判斷數(shù)據(jù)是否存在-對不存在的請求返回默認(rèn)值3.緩存擊穿:-使用互斥鎖或分布式鎖-設(shè)置熱點(diǎn)數(shù)據(jù)永不過期4.緩存雪崩:-設(shè)置合理的過期時間-使用隨機(jī)過期時間分散請求-設(shè)置緩存降級策略數(shù)據(jù)同步:-Redis持久化:RDB快照+AOF日志-發(fā)布/訂閱模式:使用RedisPub/Sub同步緩存變更-慢查詢?nèi)?/p>

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論