華為軟件工程師面試全解析及答案_第1頁
華為軟件工程師面試全解析及答案_第2頁
華為軟件工程師面試全解析及答案_第3頁
華為軟件工程師面試全解析及答案_第4頁
華為軟件工程師面試全解析及答案_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2026年華為軟件工程師面試全解析及答案一、編程能力測試(共5題,每題20分,總分100分)1.編寫一個(gè)函數(shù),實(shí)現(xiàn)快速排序算法。要求:-輸入一個(gè)整數(shù)數(shù)組,返回排序后的數(shù)組。-不能使用內(nèi)置排序函數(shù)。-說明時(shí)間復(fù)雜度和空間復(fù)雜度。答案與解析:cppinclude<vector>usingnamespacestd;voidquickSort(vector<int>&arr,intleft,intright){if(left>=right)return;intpivot=arr[left];intl=left,r=right;while(l<r){while(l<r&&arr[r]>=pivot)r--;arr[l]=arr[r];while(l<r&&arr[l]<=pivot)l++;arr[r]=arr[l];}arr[l]=pivot;quickSort(arr,left,l-1);quickSort(arr,l+1,right);}vector<int>sortArray(vector<int>&nums){quickSort(nums,0,nums.size()-1);returnnums;}解析:-快速排序是分治算法,時(shí)間復(fù)雜度為O(nlogn),最壞情況下為O(n2)。-空間復(fù)雜度為O(logn)(遞歸棧),不穩(wěn)定排序。-實(shí)現(xiàn)中,通過基準(zhǔn)值劃分左右子數(shù)組,遞歸排序。2.實(shí)現(xiàn)一個(gè)LRU(最近最少使用)緩存。要求:-支持get和put操作。-get返回鍵對應(yīng)的值,若不存在返回-1。-put插入或更新鍵值對,若容量滿則刪除最久未使用的項(xiàng)。-使用哈希表+雙向鏈表實(shí)現(xiàn)。答案與解析:cppinclude<unordered_map>include<list>classLRUCache{private:intcapacity;unordered_map<int,list<pair<int,int>>::iterator>cache;list<pair<int,int>>lst;public:LRUCache(intcapacity_):capacity(capacity_){}intget(intkey){autoit=cache.find(key);if(it==cache.end())return-1;lst.splice(lst.begin(),lst,it->second);returnit->second->second;}voidput(intkey,intvalue){autoit=cache.find(key);if(it!=cache.end()){lst.splice(lst.begin(),lst,it->second);it->second->second=value;}else{if(cache.size()==capacity){cache.erase(lst.back().first);lst.pop_back();}lst.emplace_front(key,value);cache[key]=lst.begin();}}};解析:-哈希表記錄鍵到鏈表節(jié)點(diǎn)的映射,鏈表維護(hù)訪問順序。-get操作將節(jié)點(diǎn)移動(dòng)到鏈表頭部。-put操作先檢查是否存在,存在則更新;若滿則刪除鏈表尾部節(jié)點(diǎn)。3.編寫一個(gè)函數(shù),判斷二叉樹是否對稱。要求:-輸入二叉樹的根節(jié)點(diǎn),返回是否對稱。-對稱定義:左右子樹鏡像對稱。答案與解析:cppinclude<queue>usingnamespacestd;structTreeNode{intval;TreeNodeleft,right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};boolisSymmetric(TreeNoderoot){if(!root)returntrue;returncheck(root->left,root->right);}boolcheck(TreeNodep,TreeNodeq){if(!p&&!q)returntrue;if(!p||!q)returnfalse;returnp->val==q->val&&check(p->left,q->right)&&check(p->right,q->left);}解析:-遞歸判斷左右子樹是否鏡像對稱。-空節(jié)點(diǎn)視為對稱,非空節(jié)點(diǎn)需值相等且左右子樹對稱。4.實(shí)現(xiàn)一個(gè)簡單的Trie(前綴樹)。要求:-支持插入和查詢操作。-插入時(shí)逐字符插入節(jié)點(diǎn)。-查詢時(shí)返回是否存在前綴。答案與解析:cppinclude<unordered_map>usingnamespacestd;structTrieNode{unordered_map<char,TrieNode>children;boolisEnd;TrieNode():isEnd(false){}};classTrie{private:TrieNoderoot;public:Trie():root(newTrieNode()){}voidinsert(stringword){TrieNodenode=root;for(charc:word){if(node->children.find(c)==node->children.end()){node->children[c]=newTrieNode();}node=node->children[c];}node->isEnd=true;}boolsearch(stringword){TrieNodenode=root;for(charc:word){if(node->children.find(c)==node->children.end())returnfalse;node=node->children[c];}returnnode->isEnd;}};解析:-每個(gè)節(jié)點(diǎn)存儲(chǔ)子節(jié)點(diǎn)映射,isEnd標(biāo)記詞尾。-插入時(shí)逐字符創(chuàng)建或跳轉(zhuǎn)節(jié)點(diǎn)。-查詢時(shí)逐字符匹配,若路徑存在且isEnd為true則返回true。5.編寫一個(gè)函數(shù),計(jì)算二叉樹的最大深度。要求:-輸入二叉樹的根節(jié)點(diǎn),返回最大深度。-使用遞歸或迭代方法。答案與解析:cppinclude<stack>usingnamespacestd;intmaxDepth(TreeNoderoot){if(!root)return0;intdepth=0;stack<pair<TreeNode,int>>stk;stk.emplace(root,1);while(!stk.empty()){auto[node,d]=stk.top();stk.pop();depth=max(depth,d);if(node->left)stk.emplace(node->left,d+1);if(node->right)stk.emplace(node->right,d+1);}returndepth;}解析:-迭代方法使用棧記錄節(jié)點(diǎn)和深度,逐層更新最大深度。-遞歸方法為:maxDepth=max(left,right)+1。二、系統(tǒng)設(shè)計(jì)測試(共3題,每題33分,總分99分)1.設(shè)計(jì)一個(gè)短鏈接系統(tǒng)。要求:-輸入長鏈接,返回短鏈接。-支持通過短鏈接跳轉(zhuǎn)回長鏈接。-說明系統(tǒng)架構(gòu)和主要模塊。答案與解析:系統(tǒng)架構(gòu):1.前端服務(wù)(Nginx/HAProxy):負(fù)責(zé)接收短鏈接請求,路由到后端。2.后端服務(wù)(微服務(wù)):-數(shù)據(jù)庫:存儲(chǔ)長鏈接與短鏈接的映射(主鍵為短鏈接ID)。-URL轉(zhuǎn)換模塊:-生成短鏈接(如62進(jìn)制編碼+隨機(jī)數(shù))。-查詢數(shù)據(jù)庫驗(yàn)證短鏈接,返回長鏈接。3.緩存(Redis):緩存熱點(diǎn)短鏈接,加速查詢。核心模塊:-短鏈接生成:使用hash函數(shù)(如SHA1)+Base62編碼。-路由邏輯:根據(jù)短鏈接ID查詢數(shù)據(jù)庫,返回長鏈接。偽代碼:cpp//生成短鏈接stringencode(longid){conststringchars="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";stringres="";while(id>0){res=chars[id%62]+res;id/=62;}returnres;}//查詢長鏈接stringgetLongUrl(stringshortUrl){longid=decode(shortUrl);returndb.query(id);}2.設(shè)計(jì)一個(gè)高并發(fā)短消息系統(tǒng)(如微信朋友圈)。要求:-支持用戶發(fā)布動(dòng)態(tài)、點(diǎn)贊、評論。-說明數(shù)據(jù)存儲(chǔ)方案和負(fù)載均衡策略。答案與解析:數(shù)據(jù)存儲(chǔ):-用戶表:存儲(chǔ)用戶信息(ID、昵稱等)。-動(dòng)態(tài)表:存儲(chǔ)動(dòng)態(tài)內(nèi)容(ID、用戶ID、時(shí)間、內(nèi)容、點(diǎn)贊數(shù)、評論數(shù))。-點(diǎn)贊表:用戶ID+動(dòng)態(tài)ID。-評論表:用戶ID+動(dòng)態(tài)ID+評論內(nèi)容。-Redis:緩存動(dòng)態(tài)數(shù)據(jù)、熱點(diǎn)用戶。負(fù)載均衡:-接入層:Nginx負(fù)載均衡,按流量分配到不同后端。-后端集群:多實(shí)例處理請求,數(shù)據(jù)庫分表分庫。-消息隊(duì)列(Kafka):異步處理點(diǎn)贊/評論通知。核心設(shè)計(jì):-發(fā)布動(dòng)態(tài):用戶提交內(nèi)容,寫入動(dòng)態(tài)表,更新Redis緩存。-點(diǎn)贊/評論:寫入關(guān)系表,更新動(dòng)態(tài)表統(tǒng)計(jì)。-實(shí)時(shí)通知:通過WebSocket推送更新。3.設(shè)計(jì)一個(gè)分布式文件存儲(chǔ)系統(tǒng)(如華為云OBS)。要求:-支持文件上傳、下載、刪除。-說明一致性保證和容災(zāi)方案。答案與解析:系統(tǒng)架構(gòu):1.前端服務(wù):接收客戶端請求,API網(wǎng)關(guān)(APIGateway)。2.存儲(chǔ)節(jié)點(diǎn):分布式存儲(chǔ),數(shù)據(jù)分塊(如1MB一塊)。3.元數(shù)據(jù)服務(wù):管理文件元數(shù)據(jù)(文件名、大小、塊信息)。4.副本管理:數(shù)據(jù)多副本存儲(chǔ)(如3副本,異地多活)。一致性保證:-寫操作:先寫本地,再寫副本(Quorum機(jī)制,如W=2,R=1)。-讀操作:優(yōu)先讀取最新副本。容災(zāi)方案:-跨區(qū)域副本:數(shù)據(jù)在不同可用區(qū)存儲(chǔ)。-故障切換:元數(shù)據(jù)服務(wù)高可用,存儲(chǔ)節(jié)點(diǎn)自動(dòng)選舉。偽代碼(寫操作):cppvoidwrite(stringfile,stringdata){splitData(data);//分塊for(chunk:chunks){writeLocal(chunk);writeReplicas(chunk);//寫副本}}三、算法與數(shù)據(jù)結(jié)構(gòu)測試(共5題,每題20分,總分100分)1.給定一個(gè)數(shù)組,找出其中重復(fù)次數(shù)超過一半的元素。要求:-輸入數(shù)組,返回滿足條件的元素。-時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)。答案與解析:cppintmajorityElement(vector<int>&nums){intcount=0,candidate=0;for(intnum:nums){if(count==0)candidate=num;count+=(num==candidate)?1:-1;}returncandidate;}解析:-Boyer-Moore投票算法:遍歷數(shù)組,候選者每次與當(dāng)前元素相同則+1,不同則-1。-多數(shù)元素必定存在,最終候選者為答案。2.實(shí)現(xiàn)一個(gè)二分查找的變種:查找第一個(gè)大于等于target的元素。要求:-輸入有序數(shù)組,返回目標(biāo)索引。答案與解析:cppintfirstGreaterEqual(vector<int>&nums,inttarget){intleft=0,right=nums.size();while(left<right){intmid=left+(right-left)/2;if(nums[mid]>=target)right=mid;elseleft=mid+1;}returnleft;}解析:-與標(biāo)準(zhǔn)二分查找類似,但更新條件為nums[mid]>=target時(shí)向左搜索。3.給定一個(gè)字符串,判斷是否可以通過翻轉(zhuǎn)字符串中的某些字符,使其成為回文。要求:-輸入字符串,返回是否可變?yōu)榛匚?。答案與解析:cppboolcanBePalindrome(strings){intleft=0,right=s.size()-1;intcount=0;while(left<right){if(s[left]!=s[right])count++;left++;right--;}returncount<=1;}解析:-雙指針遍歷,統(tǒng)計(jì)不等字符對數(shù)量。-若不等對超過1對,無法通過翻轉(zhuǎn)變?yōu)榛匚摹?.實(shí)現(xiàn)一個(gè)函數(shù),合并兩個(gè)有序鏈表。要求:-輸入兩個(gè)有序鏈表,返回合并后的頭節(jié)點(diǎn)。答案與解析:cppListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedummy;ListNodetail=&dummy;while(l1&&l2){if(l1->val<=l2->val){tail->next=l1;l1=l1->next;}else{tail->next=l2;l2=l2->next;}tail=tail->next;}tail->next=l1?l1:l2;retur

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論