2026年華為軟件開發(fā)工程師面試技巧與答案_第1頁
2026年華為軟件開發(fā)工程師面試技巧與答案_第2頁
2026年華為軟件開發(fā)工程師面試技巧與答案_第3頁
2026年華為軟件開發(fā)工程師面試技巧與答案_第4頁
2026年華為軟件開發(fā)工程師面試技巧與答案_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2026年華為軟件開發(fā)工程師面試技巧與答案一、編程能力測試(共5題,每題20分,總分100分)1.題目(20分):編寫一個函數(shù),實現(xiàn)字符串的翻轉(zhuǎn),要求不使用額外的字符串變量。例如,輸入`"hello"`,輸出`"olleh"`。答案:cppinclude<iostream>include<string>usingnamespacestd;stringreverseString(strings){intleft=0,right=s.size()-1;while(left<right){swap(s[left],s[right]);left++;right--;}returns;}intmain(){stringinput="hello";stringoutput=reverseString(input);cout<<output<<endl;//輸出:ollehreturn0;}解析:通過雙指針法,從字符串的兩端向中間遍歷,交換字符位置,實現(xiàn)原地翻轉(zhuǎn)。時間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。2.題目(20分):實現(xiàn)一個LRU(LeastRecentlyUsed)緩存,支持get和put操作。緩存容量為固定值,當(dāng)緩存滿時,需要淘汰最久未使用的元素。答案:cppinclude<unordered_map>include<list>classLRUCache{public:LRUCache(intcapacity):capacity_(capacity){}intget(intkey){autoit=cache_map.find(key);if(it==cache_map.end())return-1;//將訪問的元素移動到鏈表頭部cache_list.splice(cache_list.begin(),cache_list,it->second);returnit->second->second;}voidput(intkey,intvalue){autoit=cache_map.find(key);if(it!=cache_map.end()){//更新值并移動到鏈表頭部it->second->second=value;cache_list.splice(cache_list.begin(),cache_list,it->second);}else{//如果緩存已滿,刪除鏈表尾部元素if(cache_map.size()==capacity_){intdel_key=cache_list.back().first;cache_map.erase(del_key);cache_list.pop_back();}//添加新元素到鏈表頭部cache_list.emplace_front(key,value);cache_map[key]=cache_list.begin();}}private:intcapacity_;list<pair<int,int>>cache_list;//雙向鏈表存儲鍵值對unordered_map<int,list<pair<int,int>>::iterator>cache_map;//哈希表存儲鍵到鏈表節(jié)點的映射};解析:LRU緩存的核心是記錄元素的訪問順序,使用雙向鏈表存儲最近訪問的元素,哈希表實現(xiàn)O(1)時間復(fù)雜度的查找。get操作將元素移動到鏈表頭部,put操作在鏈表頭部插入新元素,如果緩存已滿則刪除鏈表尾部元素。3.題目(20分):給定一個二叉樹,判斷其是否是平衡二叉樹(左右子樹高度差不超過1)。答案:cppinclude<algorithm>usingnamespacestd;structTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx):val(x),left(NULL),right(NULL){}};intgetHeight(TreeNodenode){if(!node)return0;intleft_height=getHeight(node->left);intright_height=getHeight(node->right);if(left_height==-1||right_height==-1||abs(left_height-right_height)>1)return-1;//不平衡returnmax(left_height,right_height)+1;}boolisBalanced(TreeNoderoot){returngetHeight(root)!=-1;}解析:通過遞歸計算二叉樹的高度,如果任意節(jié)點的左右子樹高度差超過1,則返回false。使用-1標(biāo)記不平衡情況,避免重復(fù)計算。4.題目(20分):實現(xiàn)快速排序算法,要求不使用遞歸,改用迭代方式。答案:cppinclude<vector>usingnamespacestd;voidquickSort(vector<int>&nums){stack<int>stk;intleft=0,right=nums.size()-1;stk.push(left);stk.push(right);while(!stk.empty()){right=stk.top();stk.pop();left=stk.top();stk.pop();intpivot=nums[(left+right)/2];inti=left,j=right;while(i<=j){while(nums[i]<pivot)i++;while(nums[j]>pivot)j--;if(i<=j){swap(nums[i],nums[j]);i++,j--;}}if(left<j){stk.push(left);stk.push(j);}if(i<right){stk.push(i);stk.push(right);}}}解析:快速排序的核心是分治思想,迭代方式使用棧模擬遞歸調(diào)用。每次選擇樞軸,將數(shù)組分為兩部分,然后繼續(xù)對非空部分進行劃分。5.題目(20分):設(shè)計一個算法,找出數(shù)組中重復(fù)次數(shù)超過一半的元素。假設(shè)數(shù)組非空,且一定存在這樣的元素。答案:cppinclude<unordered_map>usingnamespacestd;intmajorityElement(vector<int>&nums){unordered_map<int,int>count_map;for(intnum:nums){count_map[num]++;if(count_map[num]>nums.size()/2)returnnum;}return-1;//無解情況}解析:多數(shù)元素問題要求元素出現(xiàn)次數(shù)超過數(shù)組長度的一半。通過哈希表統(tǒng)計每個元素的出現(xiàn)次數(shù),一旦某個元素計數(shù)超過一半,立即返回。二、系統(tǒng)設(shè)計能力測試(共2題,每題50分,總分100分)1.題目(50分):設(shè)計一個高并發(fā)的短鏈接系統(tǒng),要求支持秒級生成和訪問,并保證唯一性。答案:核心設(shè)計思路:1.短鏈接生成:使用哈希算法(如CRC32或MD5)或自增ID映射到短鏈接。2.唯一性校驗:結(jié)合分布式ID生成器(如TwitterSnowflake算法)或Redis確保唯一性。3.高并發(fā)訪問:使用緩存(Redis)和負載均衡(Nginx)優(yōu)化訪問性能。4.數(shù)據(jù)存儲:短鏈接與原URL的映射關(guān)系存儲在分布式數(shù)據(jù)庫(如Cassandra或Redis)。偽代碼實現(xiàn):cpp//生成短鏈接stringgenerateShortLink(stringlong_url){stringhash=md5(long_url);//計算哈希值stringshort_url=base62Encode(hash);//轉(zhuǎn)換為62進制短碼//存儲映射關(guān)系到Redisredis.set(short_url,long_url);returnshort_url;}//獲取原URLstringgetLongUrl(stringshort_url){stringlong_url=redis.get(short_url);if(!long_url){//缺失則重定向到404頁面return"404NotFound";}returnlong_url;}解析:-哈希算法保證短鏈接的緊湊性,分布式ID避免沖突。-緩存層(Redis)減少數(shù)據(jù)庫訪問壓力,負載均衡(Nginx)提高并發(fā)處理能力。-Base62編碼(如`a-zA-Z0-9`)將哈希值壓縮為短碼。2.題目(50分):設(shè)計一個實時物流軌跡追蹤系統(tǒng),要求支持百萬級設(shè)備接入,并保證低延遲查詢。答案:核心設(shè)計思路:1.數(shù)據(jù)采集:設(shè)備通過MQ(如Kafka)實時上傳軌跡數(shù)據(jù)。2.數(shù)據(jù)處理:使用流處理框架(如Flink或SparkStreaming)進行實時計算和聚合。3.數(shù)據(jù)存儲:-實時查詢:使用Redis緩存熱點設(shè)備數(shù)據(jù)。-歷史數(shù)據(jù):使用時序數(shù)據(jù)庫(如InfluxDB)存儲軌跡日志。4.查詢服務(wù):提供RESTfulAPI,通過分頁和緩存優(yōu)化查詢性能。架構(gòu)圖偽設(shè)計:[設(shè)備]>[MQ]>[流處理引擎]>[Redis(實時)]+[InfluxDB(歷史)]|+>[查詢服務(wù)]>[用戶]偽代碼實現(xiàn):cpp//設(shè)備上報軌跡數(shù)據(jù)(MQ消息){"device_id":"123","timestamp":1630,"latitude":39.92,"longitude":116.46}//流處理計算實時軌跡voidprocessTrajectory(stringdevice_id,doublelat,doublelon){redis.set(device_id,json.stringify({"lat":lat,"lon":lon}));//緩存實時位置influxdb.write(device_id,timestamp,lat,lon);//存儲歷史數(shù)據(jù)}//查詢軌跡APIstringqueryTrajectory(stringdevice_id){stringreal_time=redis.get(device_id);if(real_time)returnreal_time;//查詢歷史數(shù)據(jù)并返回returninfluxdb.query(device_id);}解析:-MQ解耦設(shè)備與后端系統(tǒng),流處理引擎保證實時性。-Redis緩存熱點數(shù)據(jù),InfluxDB優(yōu)化時序數(shù)據(jù)存儲。-分頁查詢和API緩存降低后端壓力,保證低延遲。三、算法與數(shù)據(jù)結(jié)構(gòu)(共3題,每題30分,總分90分)1.題目(30分):給定一個字符串,找出其中不重復(fù)的最長子串的長度。例如,輸入`"abcabcbb"`,輸出`3`(最長子串為"abc")。答案:cppinclude<unordered_set>usingnamespacestd;intlengthOfLongestSubstring(strings){unordered_set<char>char_set;intleft=0,max_len=0;for(intright=0;right<s.size();right++){while(char_set.find(s[right])!=char_set.end()){char_set.erase(s[left]);left++;}char_set.insert(s[right]);max_len=max(max_len,right-left+1);}returnmax_len;}解析:使用滑動窗口法,左指針`left`和右指針`right`遍歷字符串,哈希集合記錄窗口中的字符。如果遇到重復(fù)字符,移動左指針并刪除舊字符,直到窗口無重復(fù)字符。2.題目(30分):設(shè)計一個算法,判斷一個數(shù)是否是2的冪。例如,`8`是2的冪(2^3),而`7`不是。答案:cppboolisPowerOfTwo(intn){if(n<=0)returnfalse;//能被2整除且最后一位為0return(n&(n-1))==0;}解析:2的冪的二進制表示中只有一位為1(如`8`為`1000`),因此`n&(n-1)`會清除最低位的1。如果結(jié)果為0,則n是2的冪。3.題目(30分):給定一個鏈表,反轉(zhuǎn)其部分區(qū)間,例如輸入`1->2->3->4->5`,`m=2`,`n=4`,輸出`1->4->3->2

溫馨提示

  • 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

提交評論