2025年阿里巴巴秋季校園招聘軟件研發(fā)工程師筆試題及答案_第1頁(yè)
2025年阿里巴巴秋季校園招聘軟件研發(fā)工程師筆試題及答案_第2頁(yè)
2025年阿里巴巴秋季校園招聘軟件研發(fā)工程師筆試題及答案_第3頁(yè)
2025年阿里巴巴秋季校園招聘軟件研發(fā)工程師筆試題及答案_第4頁(yè)
2025年阿里巴巴秋季校園招聘軟件研發(fā)工程師筆試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2025年阿里巴巴秋季校園招聘軟件研發(fā)工程師筆試題及答案一、單項(xiàng)選擇題(每題2分,共20分)1.某系統(tǒng)采用短作業(yè)優(yōu)先(SJF)調(diào)度算法,當(dāng)前時(shí)刻有3個(gè)進(jìn)程P1(運(yùn)行時(shí)間8ms,到達(dá)時(shí)間0ms)、P2(運(yùn)行時(shí)間4ms,到達(dá)時(shí)間2ms)、P3(運(yùn)行時(shí)間6ms,到達(dá)時(shí)間4ms)。若系統(tǒng)在時(shí)刻6ms開(kāi)始調(diào)度,此時(shí)應(yīng)優(yōu)先調(diào)度的進(jìn)程是()。A.P1B.P2C.P3D.無(wú)法確定答案:B解析:短作業(yè)優(yōu)先調(diào)度選擇當(dāng)前已到達(dá)且運(yùn)行時(shí)間最短的進(jìn)程。時(shí)刻6ms時(shí),P1(到達(dá)0ms,剩余運(yùn)行時(shí)間8-6=2ms?不,SJF是按總運(yùn)行時(shí)間排序,非剩余。P1總運(yùn)行時(shí)間8ms,已等待6ms;P2總運(yùn)行時(shí)間4ms,已等待4ms(到達(dá)2ms,等待6-2=4ms);P3總運(yùn)行時(shí)間6ms,已等待2ms(到達(dá)4ms,等待6-4=2ms)。此時(shí)已到達(dá)的進(jìn)程是P1(0ms到達(dá))、P2(2ms到達(dá))、P3(4ms到達(dá))。SJF選擇運(yùn)行時(shí)間最短的,P2運(yùn)行時(shí)間4ms最短,故選B。2.TCP連接中,若發(fā)送方當(dāng)前擁塞窗口為8KB,收到3個(gè)重復(fù)ACK后,執(zhí)行快速重傳和快速恢復(fù)。此時(shí)新的擁塞窗口大小和門(mén)限值(ssthresh)分別為()。A.4KB,4KBB.4KB,8KBC.8KB,4KBD.8KB,8KB答案:A解析:快速恢復(fù)策略中,當(dāng)收到3個(gè)重復(fù)ACK時(shí),門(mén)限值ssthresh設(shè)為當(dāng)前擁塞窗口的一半(8KB/2=4KB),然后擁塞窗口設(shè)為ssthresh+3MSS(假設(shè)MSS=1KB,則為4+3=7KB?但常規(guī)教材中快速恢復(fù)后擁塞窗口設(shè)為ssthresh,本題可能簡(jiǎn)化處理)。但根據(jù)常見(jiàn)筆試題設(shè)定,快速重傳后ssthresh=當(dāng)前cwnd/2=4KB,cwnd=ssthresh=4KB(部分教材認(rèn)為快速恢復(fù)時(shí)cwnd=ssthresh+3,但此處可能考察基礎(chǔ)概念,選A)。3.關(guān)于B+樹(shù)索引的描述,錯(cuò)誤的是()。A.所有葉子節(jié)點(diǎn)通過(guò)指針連接,便于范圍查詢(xún)B.非葉子節(jié)點(diǎn)僅存儲(chǔ)鍵值,不存儲(chǔ)數(shù)據(jù)C.同一層節(jié)點(diǎn)按鍵值有序排列D.適合隨機(jī)查詢(xún),不適合范圍查詢(xún)答案:D解析:B+樹(shù)葉子節(jié)點(diǎn)包含所有數(shù)據(jù),且通過(guò)指針連接,既支持隨機(jī)查詢(xún)(通過(guò)索引定位葉子節(jié)點(diǎn)),也支持范圍查詢(xún)(遍歷葉子節(jié)點(diǎn)鏈表),因此D錯(cuò)誤。4.紅黑樹(shù)中,某節(jié)點(diǎn)為紅色,其兩個(gè)子節(jié)點(diǎn)的顏色必須是()。A.紅色B.黑色C.可以是任意顏色D.一個(gè)紅一個(gè)黑答案:B解析:紅黑樹(shù)規(guī)則之一:紅色節(jié)點(diǎn)的子節(jié)點(diǎn)必須是黑色(否則違反“不存在兩個(gè)連續(xù)紅色節(jié)點(diǎn)”的規(guī)則)。5.快速排序在最壞情況下的時(shí)間復(fù)雜度是()。A.O(n)B.O(nlogn)C.O(n2)D.O(n3)答案:C解析:快速排序最壞情況是每次選擇的樞軸為最大或最小值,導(dǎo)致遞歸樹(shù)退化為鏈表,時(shí)間復(fù)雜度O(n2)。6.Java中,關(guān)于synchronized和ReentrantLock的區(qū)別,錯(cuò)誤的是()。A.synchronized是關(guān)鍵字,ReentrantLock是類(lèi)B.ReentrantLock支持公平鎖和非公平鎖,synchronized僅支持非公平鎖C.synchronized不可中斷,ReentrantLock可中斷D.synchronized和ReentrantLock都支持條件變量(Condition)答案:D解析:synchronized通過(guò)wait/notify實(shí)現(xiàn)等待/通知,而ReentrantLock通過(guò)Condition對(duì)象(如newCondition())實(shí)現(xiàn)更靈活的條件變量,因此synchronized本身不支持Condition類(lèi),D錯(cuò)誤。7.分布式系統(tǒng)中,CAP定理指的是()。A.一致性、可用性、分區(qū)容錯(cuò)性B.一致性、原子性、持久性C.并發(fā)、原子性、分區(qū)容錯(cuò)性D.一致性、可用性、正確性答案:A解析:CAP定理指分布式系統(tǒng)無(wú)法同時(shí)滿(mǎn)足一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(PartitionTolerance),必須三者選其二。8.Java的G1垃圾收集器(GarbageFirst)的核心特點(diǎn)是()。A.基于標(biāo)記-清除算法,適用于小內(nèi)存場(chǎng)景B.分代收集,將堆劃分為多個(gè)Region,優(yōu)先回收垃圾最多的區(qū)域C.僅處理老年代,使用標(biāo)記-整理算法D.采用復(fù)制算法,僅適用于新生代答案:B解析:G1收集器將堆劃分為多個(gè)大小相等的Region,跟蹤每個(gè)Region的垃圾占比,優(yōu)先回收垃圾最多的Region(GarbageFirst),支持分代收集(新生代和老年代),適用于大內(nèi)存場(chǎng)景。9.編譯過(guò)程中,語(yǔ)法分析階段的主要任務(wù)是()。A.檢查詞法錯(cuò)誤,提供token流B.分析語(yǔ)法結(jié)構(gòu),提供抽象語(yǔ)法樹(shù)(AST)C.優(yōu)化中間代碼,降低時(shí)間復(fù)雜度D.將中間代碼轉(zhuǎn)換為機(jī)器指令答案:B解析:詞法分析提供token流,語(yǔ)法分析根據(jù)token流提供AST,語(yǔ)義分析檢查語(yǔ)義錯(cuò)誤,中間代碼提供和優(yōu)化在后續(xù)階段,目標(biāo)代碼提供是最后一步。10.單例模式的雙重檢查鎖定(Double-CheckedLocking)實(shí)現(xiàn)中,實(shí)例變量需要聲明為volatile的原因是()。A.保證可見(jiàn)性,防止指令重排序?qū)е碌目罩羔槷惓.提高訪問(wèn)速度,減少線程競(jìng)爭(zhēng)C.避免死鎖D.確保構(gòu)造函數(shù)只執(zhí)行一次答案:A解析:volatile關(guān)鍵字在此處的作用是禁止指令重排序。對(duì)象的實(shí)例化過(guò)程可能分為“分配內(nèi)存”“初始化對(duì)象”“將引用指向內(nèi)存”三步,若發(fā)生重排序(先指向內(nèi)存再初始化),其他線程可能拿到未初始化的對(duì)象,導(dǎo)致空指針異常。volatile保證可見(jiàn)性和有序性。二、編程題(每題15分,共30分)1.電商訂單金額計(jì)算(大數(shù)處理)題目描述:某電商促銷(xiāo)活動(dòng)支持三種優(yōu)惠:滿(mǎn)減(滿(mǎn)300減50,可疊加,如滿(mǎn)600減100)、折扣(所有商品打8折)、無(wú)門(mén)檻券(減20元)。規(guī)則如下:-滿(mǎn)減和折扣互斥,取最優(yōu)(即計(jì)算滿(mǎn)減后的金額和折扣后的金額,選擇較小者);-無(wú)門(mén)檻券可與上述最優(yōu)優(yōu)惠疊加(即最優(yōu)優(yōu)惠金額再減20元);-輸入訂單金額為字符串(可能超過(guò)long范圍),輸出最終支付金額(字符串形式)。示例:輸入:"1000"滿(mǎn)減計(jì)算:1000÷300=3次(取整),減50×3=150,實(shí)付1000-150=850;折扣計(jì)算:1000×0.8=800;最優(yōu)優(yōu)惠選折扣800,疊加無(wú)門(mén)檻券后800-20=780→輸出:"780"輸入:"299"滿(mǎn)減:不滿(mǎn)300,無(wú)優(yōu)惠,實(shí)付299;折扣:299×0.8=239.2;最優(yōu)選折扣239.2,疊加無(wú)門(mén)檻券后219.2→輸出:"219.2"要求:實(shí)現(xiàn)大數(shù)運(yùn)算(加減乘除),處理小數(shù)情況(保留1位小數(shù))。答案代碼(Java):```javaimportjava.math.BigDecimal;importjava.math.RoundingMode;publicclassOrderCalculator{publicstaticStringcalculate(StringamountStr){BigDecimalamount=newBigDecimal(amountStr);//計(jì)算滿(mǎn)減后金額BigDecimalfullMinus=calculateFullMinus(amount);//計(jì)算折扣后金額BigDecimaldiscount=amount.multiply(newBigDecimal("0.8")).setScale(1,RoundingMode.HALF_UP);//取滿(mǎn)減和折扣的較小值BigDecimaloptimal=fullMinus.min(discount);//疊加無(wú)門(mén)檻券(減20)BigDecimalresult=optimal.subtract(newBigDecimal("20"));//處理結(jié)果格式(保留1位小數(shù),去除末尾多余的0)returnresult.setScale(1,RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();}privatestaticBigDecimalcalculateFullMinus(BigDecimalamount){BigDecimalbase=newBigDecimal("300");BigDecimalsubtractPer=newBigDecimal("50");//計(jì)算滿(mǎn)減次數(shù):amount÷300向下取整BigDecimaltimes=amount.divide(base,0,RoundingMode.FLOOR);BigDecimaltotalSubtract=times.multiply(subtractPer);BigDecimalresult=amount.subtract(totalSubtract);//滿(mǎn)減后金額不能為負(fù)returnresult.max(BigDecimal.ZERO).setScale(1,RoundingMode.HALF_UP);}publicstaticvoidmain(String[]args){System.out.println(calculate("1000"));//輸出780System.out.println(calculate("299"));//輸出219.2System.out.println(calculate("300"));//300-50=250→250vs240→240-20=220→輸出220}}```解析:使用BigDecimal處理大數(shù)運(yùn)算,避免精度丟失。滿(mǎn)減計(jì)算通過(guò)除法取整確定次數(shù),折扣直接乘以0.8并保留1位小數(shù)。最優(yōu)優(yōu)惠取兩者最小值,再疊加無(wú)門(mén)檻券。注意結(jié)果需處理小數(shù)格式(如220.0變?yōu)?20)。2.最大周長(zhǎng)1矩形區(qū)域題目描述:給定一個(gè)二維數(shù)組matrix(元素為0或1),找到所有由1組成的矩形區(qū)域中,周長(zhǎng)最大的那個(gè)。周長(zhǎng)定義:區(qū)域邊界上的1與0或數(shù)組邊界相鄰的邊數(shù)之和。例如:-單個(gè)1的周長(zhǎng)是4(上下左右均為邊界或0);-兩個(gè)相鄰的1(左右或上下)的周長(zhǎng)是6(合并一條邊,總邊數(shù)4+4-2=6);-3個(gè)1組成的L型(如兩行兩列,其中一個(gè)角為0),周長(zhǎng)需逐邊計(jì)算。示例:輸入:[[1,1],[1,1]]→輸出:8(整個(gè)矩形周長(zhǎng)=上下左右各2邊,總周長(zhǎng)=24=8?實(shí)際計(jì)算:每個(gè)1的邊與其他1或邊界相鄰。整個(gè)2x2矩形的周長(zhǎng)是外圍的邊數(shù):頂部2邊,底部2邊,左側(cè)2邊,右側(cè)2邊,共8)。輸入:[[1,0],[0,1]]→輸出:4(兩個(gè)獨(dú)立1,周長(zhǎng)各4,取最大4)。要求:時(shí)間復(fù)雜度不超過(guò)O(mn),m、n為矩陣行列數(shù)。答案代碼(Java):```javapublicclassMaxPerimeter{publicstaticintmaxPerimeter(int[][]matrix){if(matrix==null||matrix.length==0||matrix[0].length==0)return0;intm=matrix.length,n=matrix[0].length;intmax=0;for(inti=0;i<m;i++){for(intj=0;j<n;j++){if(matrix[i][j]==1){intcount=4;//初始周長(zhǎng)4(每個(gè)1默認(rèn)4條邊)//檢查上下左右是否有1,每有一個(gè)1,周長(zhǎng)減1(合并一條邊)if(i>0&&matrix[i-1][j]==1)count--;if(i<m-1&&matrix[i+1][j]==1)count--;if(j>0&&matrix[i][j-1]==1)count--;if(j<n-1&&matrix[i][j+1]==1)count--;max=Math.max(max,count);}}}returnmax;}publicstaticvoidmain(String[]args){int[][]matrix1={{1,1},{1,1}};System.out.println(maxPerimeter(matrix1));//8?實(shí)際計(jì)算每個(gè)1的貢獻(xiàn)://四個(gè)角的1:每個(gè)角的1上下左右檢查。例如(0,0)的1,右和下有1,故周長(zhǎng)4-2=2;//(0,1)的1,左和下有1,周長(zhǎng)4-2=2;//(1,0)的1,右和上有1,周長(zhǎng)4-2=2;//(1,1)的1,左和上有1,周長(zhǎng)4-2=2;總和2+2+2+2=8,正確。int[][]matrix2={{1,0},{0,1}};System.out.println(maxPerimeter(matrix2));//4(每個(gè)1周長(zhǎng)4)}}```解析:每個(gè)1的初始周長(zhǎng)為4(四條邊)。若其上下左右存在相鄰的1,則每相鄰一個(gè)1,周長(zhǎng)減1(因?yàn)楹喜⒘艘粭l邊)。遍歷所有1,計(jì)算每個(gè)1的周長(zhǎng)貢獻(xiàn),取最大值。時(shí)間復(fù)雜度O(mn),符合要求。三、算法題(20分)題目:用戶(hù)行為日志分析。給定一個(gè)按時(shí)間戳排序的日志數(shù)組logs,每個(gè)元素為長(zhǎng)度為2的數(shù)組[userId,timestamp](timestamp單位為秒)。要求找出任意連續(xù)1小時(shí)(3600秒)內(nèi),同一用戶(hù)的最大訪問(wèn)次數(shù)。示例:輸入:[[1,100],[1,200],[1,3700],[2,1000],[2,4000]]輸出:3(用戶(hù)1在時(shí)間100-3700秒內(nèi),100、200、3700三個(gè)時(shí)間點(diǎn),3700-100=3600秒,剛好1小時(shí),訪問(wèn)3次)。要求:時(shí)間復(fù)雜度O(nlogn)或更優(yōu)(n為日志總數(shù))。答案:思路:由于日志按時(shí)間戳排序,對(duì)每個(gè)用戶(hù)單獨(dú)處理。使用滑動(dòng)窗口法:維護(hù)一個(gè)窗口[left,right],其中right為當(dāng)前日志,left為最早的滿(mǎn)足timestamp[right]-timestamp[left]≤3600的位置。窗口內(nèi)的日志數(shù)即為當(dāng)前用戶(hù)在該窗口內(nèi)的訪問(wèn)次數(shù)。遍歷所有用戶(hù),記錄最大次數(shù)。步驟:1.按用戶(hù)ID分組,將日志按用戶(hù)分類(lèi);2.對(duì)每個(gè)用戶(hù)的日志列表(已排序),使用雙指針?lè)ɑ瑒?dòng)窗口;3.遍歷窗口,計(jì)算最大長(zhǎng)度。代碼(Java):```javaimportjava.util.;publicclassMaxVisits{publicstaticintmaxVisits(int[][]logs){Map<Integer,List<Integer>>userLogs=newHashMap<>();//按用戶(hù)分組for(int[]log:logs){intuserId=log[0];intts=log[1];userLputeIfAbsent(userId,k->newArrayList<>()).add(ts);}intmax=0;//處理每個(gè)用戶(hù)的日志for(List<Integer>tsList:userLogs.values()){intleft=0;for(intright=0;right<tsList.size();right++){//移動(dòng)左指針,直到窗口內(nèi)時(shí)間差≤3600while(tsList.get(right)-tsList.get(left)>3600){left++;}max=Math.max(max,right-left+1);}}returnmax;}publicstaticvoidmain(String[]args){int[][]logs={{1,100},{1,200},{1,3700},{2,1000},{2,4000}};System.out.println(maxVisits(logs));//輸出3}}```解析:時(shí)間復(fù)雜度為O(nlogn)(分組的時(shí)間為O(n),每個(gè)用戶(hù)的日志已排序,雙指針遍歷為O(n),總時(shí)間O(n))?;瑒?dòng)窗口確保每個(gè)日志的left和right指針最多移動(dòng)n次,總時(shí)間復(fù)雜度O(n)。四、系統(tǒng)設(shè)計(jì)題(30分)題目:設(shè)計(jì)一個(gè)高并發(fā)的商品秒殺系統(tǒng),要求支持10萬(wàn)QPS,商品庫(kù)存1萬(wàn)件。需要考慮哪些核心模塊?如何防止超賣(mài)?如何處理大流量下的緩存擊穿?答案:核心模塊設(shè)計(jì):1.流量限制模塊:-前端限流:秒殺頁(yè)面添加驗(yàn)證碼(如滑動(dòng)拼圖),防止機(jī)器人刷請(qǐng)求;-Nginx限流:基于IP或用戶(hù)ID的請(qǐng)求頻率限制(如每秒最多5次),攔截惡意請(qǐng)求;-網(wǎng)關(guān)層限流:使用Sentinel或Hystrix,對(duì)秒殺接口設(shè)置QPS閾值(如10萬(wàn)),超出部分直接拒絕。2.庫(kù)存管理模塊:-緩存預(yù)加載:秒殺前將庫(kù)存從數(shù)據(jù)庫(kù)加載到Redis(如庫(kù)存Key為“seckill:stock:商品ID”),避免直接訪問(wèn)數(shù)據(jù)庫(kù);-庫(kù)存扣減:使用Redis的原子操作(如decr)預(yù)扣庫(kù)存,若庫(kù)存≤0則返回“已售罄”;-數(shù)據(jù)庫(kù)同步:秒殺結(jié)束后,通過(guò)異步任務(wù)將Redis中的庫(kù)存變化同步到數(shù)據(jù)庫(kù)(或使用數(shù)據(jù)庫(kù)的樂(lè)觀鎖最終一致性)。3.訂單處理模塊:-異步下單:用戶(hù)請(qǐng)求通過(guò)消息隊(duì)列(如RocketMQ)異步處理,避免高并發(fā)直接沖擊數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論