軟件工程師技術(shù)面試題及解答指南_第1頁
軟件工程師技術(shù)面試題及解答指南_第2頁
軟件工程師技術(shù)面試題及解答指南_第3頁
軟件工程師技術(shù)面試題及解答指南_第4頁
軟件工程師技術(shù)面試題及解答指南_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2026年軟件工程師技術(shù)面試題及解答指南一、編程語言基礎(chǔ)(3題,每題10分,共30分)題目1:請用Python編寫一個函數(shù),接收一個字符串列表,返回其中所有包含重復(fù)字符的字符串。例如,輸入`["abc","aab","xyz","aabb"]`,輸出`["aab","aabb"]`。要求不使用額外的庫函數(shù),時間復(fù)雜度盡可能低。題目2:在Java中,編寫一個方法,接收一個整數(shù)數(shù)組,返回一個新數(shù)組,其中包含原數(shù)組中所有奇數(shù)的平方。例如,輸入`[1,2,3,4,5]`,輸出`[1,9,25]`。要求原地修改數(shù)組時,不使用額外的數(shù)組空間。題目3:用C++實現(xiàn)一個類`UniqueVector`,繼承自`std::vector`,并重寫`push_back`方法,確保插入的元素在向量中唯一(即不允許重復(fù))。如果嘗試插入重復(fù)元素,則不添加并返回`false`,否則添加并返回`true`。要求使用標(biāo)準(zhǔn)庫,不使用第三方庫。二、數(shù)據(jù)結(jié)構(gòu)與算法(4題,每題15分,共60分)題目4:設(shè)計一個LRU(最近最少使用)緩存,容量為`capacity`。支持`get(key)`和`put(key,value)`操作。要求使用雙向鏈表和哈希表實現(xiàn),`get`和`put`操作的時間復(fù)雜度為O(1)。題目5:給定一個整數(shù)數(shù)組,返回所有和為`target`的三個不同索引的組合。例如,輸入`[2,7,11,15,-2]`,`target=9`,輸出`[[0,1,2],[2,3,4]]`。要求不使用重復(fù)的組合,可以假設(shè)數(shù)組中元素唯一。題目6:編寫一個函數(shù),判斷一個二叉樹是否是平衡二叉樹(即任意節(jié)點的左右子樹高度差不超過1)。要求使用后序遍歷實現(xiàn),時間復(fù)雜度為O(n)。題目7:實現(xiàn)一個字符串的子串搜索算法,要求不使用KMP或Boyer-Moore算法,而是手動實現(xiàn)樸素算法。例如,輸入`text="ABCDABCDABDE"`,`pattern="ABCDABD"`,輸出`6`(子串從第6個字符開始匹配)。三、系統(tǒng)設(shè)計與架構(gòu)(3題,每題20分,共60分)題目8:設(shè)計一個簡單的短鏈接服務(wù)(如`t.co`)。要求支持:1.將長URL轉(zhuǎn)換為短URL,短URL長度不超過6位。2.通過短URL快速解析回原始長URL。3.考慮高并發(fā)場景下的性能和可用性,簡述主要技術(shù)選型(如數(shù)據(jù)庫、緩存、負載均衡)。題目9:設(shè)計一個消息隊列系統(tǒng)(如Kafka的簡化版),要求支持:1.生產(chǎn)者發(fā)送消息,消費者拉取消息。2.消息持久化到磁盤,防止數(shù)據(jù)丟失。3.實現(xiàn)至少一次傳遞(at-least-oncedelivery)的機制。簡述如何避免重復(fù)消費。題目10:設(shè)計一個高并發(fā)的秒殺系統(tǒng),要求:1.支持高并發(fā)請求(如每秒10萬+)。2.防止超賣和重復(fù)購買。3.簡述數(shù)據(jù)庫選型、緩存策略和限流方案。四、數(shù)據(jù)庫與存儲(2題,每題25分,共50分)題目11:設(shè)計一個電商訂單表`orders`,要求:1.包含`id`(主鍵)、`user_id`、`product_id`、`price`、`status`(如待支付、已支付)、`create_time`。2.`status`字段需要支持快速查詢(如統(tǒng)計“已支付”訂單數(shù)量)。3.說明如何優(yōu)化查詢性能(如索引設(shè)計、分區(qū)策略)。題目12:假設(shè)你需要存儲大量的用戶行為日志(如點擊、瀏覽),設(shè)計一個合適的存儲方案:1.選擇合適的數(shù)據(jù)庫類型(關(guān)系型、NoSQL或混合)。2.說明數(shù)據(jù)模型設(shè)計(如表結(jié)構(gòu)或文檔結(jié)構(gòu))。3.如何應(yīng)對數(shù)據(jù)量增長帶來的挑戰(zhàn)(如分表、分庫)。五、網(wǎng)絡(luò)與安全(2題,每題25分,共50分)題目13:解釋HTTP/2與HTTP/1.1的主要區(qū)別,并說明為什么HTTP/2能提升網(wǎng)站性能。要求結(jié)合TCP連接、頭部壓縮、多路復(fù)用等概念。題目14:設(shè)計一個防止SQL注入的方案,要求:1.說明常見的SQL注入攻擊方式。2.如何通過參數(shù)化查詢或ORM框架防御。3.簡述其他安全措施(如WAF、權(quán)限控制)。答案與解析一、編程語言基礎(chǔ)題目1:pythondeffind_duplicates(strings):seen=set()duplicates=[]forsinstrings:ifany(cinseenforcins):duplicates.append(s)forcins:seen.add(c)returnduplicates解析:-使用集合`seen`記錄已遍歷的字符,遍歷每個字符串時檢查是否有重復(fù)字符。-時間復(fù)雜度O(NM),N為字符串?dāng)?shù)量,M為字符串最大長度。可優(yōu)化為哈希表記錄字符頻率,但題目要求不使用庫函數(shù)。題目2:javapublicstaticint[]squareOdds(int[]arr){intn=0;for(intnum:arr){if(num%2!=0){arr[n++]=numnum;}}returnArrays.copyOf(arr,n);}解析:-先統(tǒng)計奇數(shù)數(shù)量`n`,然后原地修改數(shù)組,最后復(fù)制前`n`個元素。避免使用額外數(shù)組空間。題目3:cppinclude<vector>include<unordered_set>classUniqueVector:publicstd::vector<int>{public:boolpush_back(intvalue)override{if(std::find(this->begin(),this->end(),value)!=this->end()){returnfalse;}std::vector<int>::push_back(value);returntrue;}};解析:-重寫`push_back`,使用`std::find`檢查元素是否已存在。注意`std::find`的時間復(fù)雜度為O(n),可進一步優(yōu)化為哈希表。二、數(shù)據(jù)結(jié)構(gòu)與算法題目4:cppclassLRUCache{private:structNode{intkey,value;Nodeprev,next;Node(intk,intv):key(k),value(v),prev(nullptr),next(nullptr){}};unordered_map<int,Node>cache;Nodehead=newNode(0,0),tail=newNode(0,0);intcapacity;public:LRUCache(intc):capacity(c){head->next=tail;tail->prev=head;}intget(intkey){autoit=cache.find(key);if(it==cache.end())return-1;Nodenode=it->second;moveToHead(node);returnnode->value;}voidput(intkey,intvalue){autoit=cache.find(key);if(it!=cache.end()){Nodenode=it->second;node->value=value;moveToHead(node);}else{if(cache.size()==capacity){removeTail();}NodenewNode=newNode(key,value);cache[key]=newNode;addToHead(newNode);}}voidmoveToHead(Nodenode){removeNode(node);addToHead(node);}voidaddToHead(Nodenode){node->next=head->next;node->prev=head;head->next->prev=node;head->next=node;}voidremoveNode(Nodenode){node->prev->next=node->next;node->next->prev=node->prev;}voidremoveTail(){NodetailPrev=tail->prev;removeNode(tailPrev);cache.erase(tailPrev->key);deletetailPrev;}};解析:-使用雙向鏈表維護LRU順序,哈希表記錄鍵值對,確保O(1)操作。`moveToHead`表示節(jié)點被訪問,`removeTail`用于淘汰最久未使用節(jié)點。題目5:pythondefthree_sum(nums,target):nums.sort()result=[]n=len(nums)foriinrange(n-2):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==target:result.append([i,left,right])whileleft<rightandnums[left]==nums[left+1]:left+=1whileleft<rightandnums[right]==nums[right-1]:right-=1left+=1right-=1eliftotal<target:left+=1else:right-=1returnresult解析:-排序后使用雙指針,避免重復(fù)組合。跳過重復(fù)值以減少無效計算。題目6:javaclassTreeNode{intval;TreeNodeleft,right;TreeNode(intx){val=x;}}publicbooleanisBalanced(TreeNoderoot){returncheckHeight(root)!=-1;}privateintcheckHeight(TreeNodenode){if(node==null)return0;intleftHeight=checkHeight(node.left);if(leftHeight==-1)return-1;intrightHeight=checkHeight(node.right);if(rightHeight==-1)return-1;if(Math.abs(leftHeight-rightHeight)>1)return-1;returnMath.max(leftHeight,rightHeight)+1;}解析:-后序遍歷檢查每個節(jié)點的左右子樹高度差,若不平衡返回-1。整體時間復(fù)雜度O(n)。題目7:pythondefnaive_substring_search(text,pattern):n,m=len(text),len(pattern)foriinrange(n-m+1):match=Trueforjinrange(m):iftext[i+j]!=pattern[j]:match=Falsebreakifmatch:returnireturn-1解析:-暴力匹配,遍歷文本中所有可能的起始位置,檢查是否匹配模式。時間復(fù)雜度O(nm)。三、系統(tǒng)設(shè)計與架構(gòu)題目8:設(shè)計短鏈接服務(wù):1.URL轉(zhuǎn)換:-使用哈希函數(shù)(如MD5)將長URL生成固定長度的短碼(如`base62`編碼)。-例如,`MD5("")`→`5f4dcc3b5aa765d61d8327deb882cf99`→`http://t.co/abc123`。2.數(shù)據(jù)庫設(shè)計:-表結(jié)構(gòu):`id`(自增),`short_code`(唯一,如6位字母數(shù)字組合),`long_url`(文本)。-索引:`short_code`為主鍵索引。3.緩存:-使用Redis緩存熱點短鏈接,減少數(shù)據(jù)庫查詢。4.高并發(fā):-負載均衡分發(fā)請求,數(shù)據(jù)庫讀寫分離。-限流措施(如令牌桶算法)防止服務(wù)過載。題目9:消息隊列設(shè)計:1.生產(chǎn)者-消費者模型:-生產(chǎn)者將消息追加到持久化隊列(如RocksDB或LevelDB)。-消費者拉取消息,確認消費后刪除。2.至少一次傳遞:-消息持久化到磁盤,即使服務(wù)崩潰也能恢復(fù)。-消費者使用冪等性設(shè)計(如記錄已消費消息ID)。3.避免重復(fù)消費:-發(fā)送方添加唯一消息ID,消費方記錄ID防止重試。-狀態(tài)機控制消息狀態(tài)(待消費/已消費)。題目10:秒殺系統(tǒng)設(shè)計:1.數(shù)據(jù)庫選型:-使用MySQL+Redis緩存。Redis存儲用戶秒殺狀態(tài)。2.防超賣:-使用數(shù)據(jù)庫事務(wù)+行鎖(如`SELECT...FORUPDATE`)鎖定庫存。3.限流:-令牌桶算法限流,分布式鎖防止并發(fā)寫入。-預(yù)熱技術(shù)(如提前加載商品信息到內(nèi)存)。四、數(shù)據(jù)庫與存儲題目11:電商訂單表設(shè)計:1.表結(jié)構(gòu):sqlCREATETABLEorders(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINT,product_idBIGINT,priceDECIMAL(10,2),statusENUM('pending','paid','shipped')NOTNULL,create_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP);2.索引優(yōu)化:-`status`字段加索引:`INDEX(status)`。-聯(lián)合索引:`INDEX(user_id,status)`(用于統(tǒng)計用戶待支付訂單)。3.分區(qū)策略:-按時間分區(qū)(如按月分區(qū)),提高查詢性能。題目12:用戶行為日志存儲:1.

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論