2026年阿里巴軟件開發(fā)工程師面試題集_第1頁
2026年阿里巴軟件開發(fā)工程師面試題集_第2頁
2026年阿里巴軟件開發(fā)工程師面試題集_第3頁
2026年阿里巴軟件開發(fā)工程師面試題集_第4頁
2026年阿里巴軟件開發(fā)工程師面試題集_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2026年阿里巴軟件開發(fā)工程師面試題集一、編程基礎(chǔ)與數(shù)據(jù)結(jié)構(gòu)(共5題,每題10分,總分50分)1.題目:請實現(xiàn)一個函數(shù),輸入一個非負整數(shù)`n`,返回`n`的二進制表示中`1`的個數(shù)。例如,輸入`11`(二進制為`1011`),返回`3`。要求:時間復雜度O(logn),不使用內(nèi)置函數(shù)。答案:javapublicintcountBits(intn){intcount=0;while(n!=0){count+=n&1;n>>>=1;}returncount;}解析:-使用位運算`n&1`獲取最低位的`0`或`1`,然后右移一位`n>>>=1`,重復直到`n`為`0`。-時間復雜度O(logn),因為每次操作減少一位。-空間復雜度O(1)。2.題目:給定一個鏈表,反轉(zhuǎn)鏈表并返回反轉(zhuǎn)后的頭節(jié)點。例如,輸入`1->2->3->4->5`,輸出`5->4->3->2->1`。要求:原地反轉(zhuǎn),不使用額外空間。答案:javapublicListNodereverseList(ListNodehead){ListNodeprev=null;ListNodecurr=head;while(curr!=null){ListNodenextTemp=curr.next;curr.next=prev;prev=curr;curr=nextTemp;}returnprev;}解析:-使用三個指針`prev`、`curr`和`nextTemp`,逐個節(jié)點反轉(zhuǎn)。-時間復雜度O(n),空間復雜度O(1)。3.題目:實現(xiàn)一個`LRUCache`(最近最少使用緩存),支持`get`和`put`操作。要求:-`get(key)`:如果鍵存在,返回值;否則返回`-1`。-`put(key,value)`:如果鍵存在,更新值;否則添加鍵值對。當緩存容量滿時,刪除最久未使用的鍵。-使用雙向鏈表和哈希表實現(xiàn)。答案:javaclassLRUCache{classNode{intkey,value;Nodeprev,next;Node(intk,intv){key=k;value=v;}}Map<Integer,Node>map=newHashMap<>();Nodehead=newNode(0,0),tail=newNode(0,0);intcapacity;publicLRUCache(intcap){capacity=cap;head.next=tail;tail.prev=head;}publicintget(intkey){Nodenode=map.get(key);if(node==null)return-1;moveToHead(node);returnnode.value;}publicvoidput(intkey,intvalue){Nodenode=map.get(key);if(node!=null){node.value=value;moveToHead(node);}else{if(map.size()==capacity){map.remove(tail.prev.key);removeNode(tail.prev);}NodenewNode=newNode(key,value);map.put(key,newNode);addNode(newNode);}}privatevoidaddNode(Nodenode){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}privatevoidremoveNode(Nodenode){node.prev.next=node.next;node.next.prev=node.prev;}privatevoidmoveToHead(Nodenode){removeNode(node);addNode(node);}}解析:-使用雙向鏈表維護訪問順序,哈希表快速查找。-`get`操作將節(jié)點移動到頭部,`put`操作在滿時刪除尾節(jié)點。-時間復雜度`get`和`put`均為O(1)。4.題目:給定一個數(shù)組`nums`和一個目標值`target`,找出數(shù)組中和為`target`的兩個數(shù),并返回它們的索引。例如,`nums=[2,7,11,15]`,`target=9`,返回`[0,1]`(因為`2+7=9`)。要求:不使用重復元素。答案:javapublicint[]twoSum(int[]nums,inttarget){Map<Integer,Integer>map=newHashMap<>();for(inti=0;i<nums.length;i++){intcomplement=target-nums[i];if(map.containsKey(complement)){returnnewint[]{map.get(complement),i};}map.put(nums[i],i);}returnnewint[]{};}解析:-使用哈希表記錄每個數(shù)的索引,避免重復遍歷。-時間復雜度O(n),空間復雜度O(n)。5.題目:實現(xiàn)一個函數(shù),檢查給定字符串是否是有效的括號組合。例如,`"()"`和`"(())"`是有效的,`"(()"`是無效的。要求:僅使用`'('`、`')'`和`'{'`、`'}'`、`'['`、`']'`。答案:javapublicbooleanisValid(Strings){Stack<Character>stack=newStack<>();Map<Character,Character>map=newHashMap<>();map.put(')','(');map.put('}','{');map.put(']','[');for(charc:s.toCharArray()){if(map.containsKey(c)){if(stack.isEmpty()||stack.pop()!=map.get(c)){returnfalse;}}else{stack.push(c);}}returnstack.isEmpty();}解析:-使用棧匹配括號,左括號入棧,右括號出棧并檢查是否匹配。-時間復雜度O(n),空間復雜度O(n)。二、算法設(shè)計(共4題,每題12分,總分48分)1.題目:設(shè)計一個算法,將一個非降序數(shù)組`nums`變形為`nums[0]<=nums[1]>=nums[2]<=nums[3]...`的峰谷序列。例如,輸入`[1,2,3,4,5]`,輸出`[1,4,2,5,3]`。要求:原地修改,時間復雜度O(n)。答案:javapublicvoidwiggleSort(int[]nums){for(inti=0;i<nums.length-1;i++){if((i%2==0&&nums[i]>nums[i+1])||(i%2==1&&nums[i]<nums[i+1])){swap(nums,i,i+1);}}}privatevoidswap(int[]nums,inti,intj){inttemp=nums[i];nums[i]=nums[j];nums[j]=temp;}解析:-遍歷數(shù)組,奇數(shù)位應比相鄰偶數(shù)位大,偶數(shù)位應比相鄰奇數(shù)位小。-時間復雜度O(n),空間復雜度O(1)。2.題目:設(shè)計一個函數(shù),找出數(shù)組中所有出現(xiàn)次數(shù)超過`n/3`的元素。例如,`nums=[1,1,1,3,3,2,2,2]`,返回`[1,2]`。要求:時間復雜度O(n),空間復雜度O(1)。答案:javapublicList<Integer>majorityElement(int[]nums){List<Integer>result=newArrayList<>();if(nums==null||nums.length==0)returnresult;intcandidate1=nums[0],candidate2=nums[0],count1=0,count2=0;for(intnum:nums){if(num==candidate1){count1++;}elseif(num==candidate2){count2++;}elseif(count1==0){candidate1=num;count1=1;}elseif(count2==0){candidate2=num;count2=1;}else{count1--;count2--;}}count1=count2=0;for(intnum:nums){if(num==candidate1)count1++;elseif(num==candidate2)count2++;}if(count1>nums.length/3)result.add(candidate1);if(count2>nums.length/3)result.add(candidate2);returnresult;}解析:-Boyer-Moore投票算法,找到兩個候選者,再驗證它們的次數(shù)。-時間復雜度O(n),空間復雜度O(1)。3.題目:設(shè)計一個算法,將一個`mxn`的矩陣原地旋轉(zhuǎn)90度。例如,輸入`[[1,2,3],[4,5,6],[7,8,9]]`,輸出`[[7,4,1],[8,5,2],[9,6,3]]`。要求:原地旋轉(zhuǎn),時間復雜度O(mn)。答案:javapublicvoidrotate(int[][]matrix){intn=matrix.length;for(intlayer=0;layer<n/2;layer++){intfirst=layer;intlast=n-1-layer;for(inti=first;i<last;i++){intoffset=i-first;inttop=matrix[first][i];matrix[first][i]=matrix[last-offset][first];matrix[last-offset][first]=matrix[last][last-offset];matrix[last][last-offset]=matrix[i][last];matrix[i][last]=top;}}}解析:-分層旋轉(zhuǎn),每層按順時針方向移動四個元素。-時間復雜度O(mn),空間復雜度O(1)。4.題目:設(shè)計一個算法,找出字符串中的最長回文子串。例如,`s="babad"`,返回`"bab"`或`"aba"`。要求:時間復雜度O(n^2),空間復雜度O(1)。答案:javapublicStringlongestPalindrome(Strings){if(s==null||s.length()<1)return"";intstart=0,end=0;for(inti=0;i<s.length();i++){intlen1=expandAroundCenter(s,i,i);intlen2=expandAroundCenter(s,i,i+1);intlen=Math.max(len1,len2);if(len>end-start){start=i-(len-1)/2;end=i+len/2;}}returns.substring(start,end+1);}privateintexpandAroundCenter(Strings,intleft,intright){while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){left--;right++;}returnright-left-1;}解析:-中心擴展法,遍歷每個字符作為中心,擴展左右。-時間復雜度O(n^2),空間復雜度O(1)。三、系統(tǒng)設(shè)計(共2題,每題20分,總分40分)1.題目:設(shè)計一個簡單的微博系統(tǒng),要求支持以下功能:-用戶注冊、登錄。-發(fā)布微博(包含文本內(nèi)容、時間戳、用戶ID)。-按時間倒序查看用戶的所有微博。-按時間倒序查看用戶的關(guān)注者看到的微博(包含用戶自己發(fā)的和關(guān)注的人發(fā)的)。-支持關(guān)注/取消關(guān)注用戶。要求:說明核心數(shù)據(jù)結(jié)構(gòu)和主要接口設(shè)計。答案:-數(shù)據(jù)結(jié)構(gòu):-`User`:用戶表(`UserID`,`Username`,`Password`)。-`Tweet`:微博表(`TweetID`,`UserID`,`Content`,`Timestamp`)。-`Follow`:關(guān)注表(`UserID`,`FollowedID`)。-`UserTimeline`:用戶時間線(緩存用戶最近`N`條微博)。-主要接口:-`register(username,password)`:注冊用戶。-`login(username,password)`:用戶登錄。-`postTweet(userID,content)`:發(fā)布微博。-`getTimeline(userID)`:獲取用戶時間線。-`getFeed(userID)`:獲取關(guān)注者時間線。-`follow(userID,followedID)`:關(guān)注用戶。-`unfollow(userID,followedID)`:取消關(guān)注。-核心邏輯:-`getTimeline`:直接從`UserTimeline`獲取。-`getFeed`:合并關(guān)注者的`Tweet`,按時間排序。-使用分頁加載減少數(shù)據(jù)量。解析:-微博系統(tǒng)核心是用戶關(guān)系和時間線展示。-關(guān)注關(guān)系用圖表示,時間線用數(shù)據(jù)庫索引優(yōu)化。-緩存熱點用戶時間線提高性能。2.題目:設(shè)計一個短鏈接生成服務(如`tinyurl`),要求:-輸入長鏈接,生成短鏈接。-輸入短鏈接,解析為長鏈接。-短鏈接唯一且可快速生成/解析。-支持自定義短鏈接前綴(可選)。要求:說明數(shù)據(jù)結(jié)構(gòu)、算法和分布式方案。答案:-數(shù)據(jù)結(jié)構(gòu):-`Link`:鏈接表(`ShortID`,`LongURL`,`CreatorID`)。-使用自增ID或Base62編碼(如`a-zA-Z0-9`)生成`ShortID`。-算法:-生成短ID:將自增ID轉(zhuǎn)換為62進制。-解析短ID:將62進制轉(zhuǎn)換回自增ID,查表獲取長鏈接。-分布式方案:-使用分布式數(shù)據(jù)庫(如RedisCluster)存儲`Link`。-高可用:多副本冗余,負載均衡。-接口設(shè)計:-`shorten(longURL,prefix)`:生成短鏈接。-`resolve(shortID)`:解析短鏈接。解析:-關(guān)鍵是短ID生成和快速查找。-Base62編碼減少短ID長度。-分布式部署保證高并發(fā)和容災。四、數(shù)據(jù)庫與中間件(共3題,每題15分,總分45分)1.題目:設(shè)計一個數(shù)據(jù)庫表,存儲用戶的訂單信息,要求:-支持按用戶ID和訂單時間范圍查詢。-支持按訂單狀態(tài)(待支付、已支付、已發(fā)貨)統(tǒng)計數(shù)量。-說明表結(jié)構(gòu)、索引設(shè)計和查詢優(yōu)化。答案:-表結(jié)構(gòu):sqlCREATETABLEOrders(OrderIDINTPRIMARYKEYAUTO_INCREMENT,UserIDINT,OrderTimeDATETIME,StatusENUM('pending','paid','shipped'),AmountDECIMAL(10,2));-索引設(shè)計:-主鍵索引`OrderID`。-聚合索引`(UserID,OrderTime)`支持按用戶和時間范圍查詢。-單列索引`Status`支持狀態(tài)統(tǒng)計。-查詢優(yōu)化:-查詢示例:sqlSELECTFROMOrdersWHEREUserID=?ANDOrderTimeBETWEEN?AND?;SELECTStatus,COUNT()FROMOrdersWHEREStatus

溫馨提示

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

最新文檔

評論

0/150

提交評論