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

下載本文檔

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

文檔簡(jiǎn)介

2026年華為公司軟件工程師面試全解及答案一、編程基礎(chǔ)與數(shù)據(jù)結(jié)構(gòu)(5題,每題20分,共100分)1.題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)正整數(shù)`n`,返回`n`的漢諾塔移動(dòng)步驟。例如,`n=2`時(shí),移動(dòng)步驟為:移動(dòng)盤子1從源塔到目標(biāo)塔移動(dòng)盤子2從源塔到輔助塔移動(dòng)盤子1從輔助塔到目標(biāo)塔移動(dòng)盤子2從源塔到目標(biāo)塔答案:cppinclude<iostream>include<string>voidhanoi(intn,charfrom_rod,charto_rod,charaux_rod){if(n==1){std::cout<<"移動(dòng)盤子1從"<<from_rod<<"到"<<to_rod<<std::endl;return;}hanoi(n-1,from_rod,aux_rod,to_rod);std::cout<<"移動(dòng)盤子"<<n<<"從"<<from_rod<<"到"<<to_rod<<std::endl;hanoi(n-1,aux_rod,to_rod,from_rod);}intmain(){intn=2;hanoi(n,'A','C','B');return0;}解析:漢諾塔問題采用遞歸解決,核心思想是將`n-1`個(gè)盤子先移動(dòng)到輔助塔,再移動(dòng)最大的盤子到目標(biāo)塔,最后將`n-1`個(gè)盤子從輔助塔移動(dòng)到目標(biāo)塔。遞歸的終止條件是只剩一個(gè)盤子時(shí)直接移動(dòng)。2.題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)無重復(fù)元素的數(shù)組`nums`和一個(gè)目標(biāo)值`target`,返回所有相加等于`target`的`nums`中`index`的有序組合。例如:cppnums=[2,7,11,15],target=9輸出:[[0,1]]答案:cppinclude<vector>include<unordered_map>std::vector<std::vector<int>>twoSum(std::vector<int>&nums,inttarget){std::unordered_map<int,int>num_map;std::vector<std::vector<int>>result;for(inti=0;i<nums.size();++i){intcomplement=target-nums[i];if(num_map.find(complement)!=num_map.end()){result.push_back({num_map[complement],i});}num_map[nums[i]]=i;}returnresult;}intmain(){std::vector<int>nums={2,7,11,15};inttarget=9;autores=twoSum(nums,target);for(constauto&vec:res){std::cout<<"["<<vec[0]<<","<<vec[1]<<"]";}return0;}解析:使用哈希表記錄每個(gè)數(shù)及其索引,遍歷時(shí)計(jì)算`complement=target-nums[i]`,若`complement`已在哈希表中,則返回對(duì)應(yīng)的組合。時(shí)間復(fù)雜度為`O(n)`。3.題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)字符串`s`,返回所有可能的子集。例如:cpps="abc"輸出:["","a","b","ab","c","ac","bc","abc"]答案:cppinclude<vector>include<string>voidsubsetsHelper(conststd::string&s,intindex,std::stringcurrent,std::vector<std::string>&result){result.push_back(current);for(inti=index;i<s.size();++i){current+=s[i];subsetsHelper(s,i+1,current,result);current.pop_back();}}std::vector<std::string>subsets(std::strings){std::vector<std::string>result;subsetsHelper(s,0,"",result);returnresult;}intmain(){std::strings="abc";autores=subsets(s);for(constauto&str:res){std::cout<<"\""<<str<<"\"";}return0;}解析:采用回溯法生成所有子集,每次選擇當(dāng)前字符或不選擇,逐步構(gòu)建子集。時(shí)間復(fù)雜度為`O(2^n)`。4.題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)鏈表,返回其反轉(zhuǎn)后的鏈表。例如:cpp輸入:1->2->3->NULL輸出:3->2->1->NULL答案:cppinclude<iostream>structListNode{intval;ListNodenext;ListNode(intx):val(x),next(NULL){}};ListNodereverseList(ListNodehead){ListNodeprev=NULL;ListNodecurrent=head;while(current!=NULL){ListNodenext_node=current->next;current->next=prev;prev=current;current=next_node;}returnprev;}intmain(){ListNodehead=newListNode(1);head->next=newListNode(2);head->next->next=newListNode(3);autoreversed=reverseList(head);while(reversed!=NULL){std::cout<<reversed->val<<"";reversed=reversed->next;}return0;}解析:采用迭代法反轉(zhuǎn)鏈表,使用三個(gè)指針`prev`、`current`和`next_node`依次反轉(zhuǎn)每個(gè)節(jié)點(diǎn)的`next`指針。5.題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)字符串`s`,返回其最長(zhǎng)回文子串的長(zhǎng)度。例如:cpps="babad"輸出:3("bab"或"aba")答案:cppinclude<string>intlongestPalindrome(std::strings){if(s.empty())return0;intstart=0,end=0;for(inti=0;i<s.size();++i){intlen1=expandAroundCenter(s,i,i);intlen2=expandAroundCenter(s,i,i+1);intlen=std::max(len1,len2);if(len>end-start){start=i-(len-1)/2;end=i+len/2;}}returnend-start+1;}intexpandAroundCenter(conststd::string&s,intleft,intright){while(left>=0&&right<s.size()&&s[left]==s[right]){--left;++right;}returnright-left-1;}intmain(){std::strings="babad";std::cout<<longestPalindrome(s)<<std::endl;return0;}解析:采用中心擴(kuò)展法,遍歷每個(gè)字符作為中心,分別檢查奇數(shù)長(zhǎng)度和偶數(shù)長(zhǎng)度的回文子串,記錄最大長(zhǎng)度。二、系統(tǒng)設(shè)計(jì)(2題,每題50分,共100分)1.題目:設(shè)計(jì)一個(gè)簡(jiǎn)單的微博系統(tǒng),需要支持以下功能:-用戶發(fā)布微博(最多140字)-用戶關(guān)注其他用戶-用戶獲取自己關(guān)注的人的最新微博要求:-說明核心數(shù)據(jù)結(jié)構(gòu)-描述主要模塊設(shè)計(jì)-分析系統(tǒng)瓶頸及優(yōu)化方案答案:核心數(shù)據(jù)結(jié)構(gòu):1.User:存儲(chǔ)用戶信息,包括`id`、`username`、`followers`(關(guān)注的人集合)、`followees`(自己關(guān)注的人集合)、`tweets`(發(fā)布過的微博)。2.Tweet:存儲(chǔ)微博信息,包括`id`、`user_id`(發(fā)布者)、`content`(內(nèi)容)、`timestamp`(發(fā)布時(shí)間)。主要模塊設(shè)計(jì):1.發(fā)布模塊:用戶發(fā)布微博時(shí),將`Tweet`插入數(shù)據(jù)庫,并更新該用戶的`tweets`列表。2.關(guān)注模塊:用戶關(guān)注時(shí),將對(duì)方加入`followees`,對(duì)方加入`followers`。3.獲取微博模塊:遍歷用戶`followees`,按時(shí)間倒序返回最新的`N`條微博。系統(tǒng)瓶頸及優(yōu)化方案:-瓶頸:獲取微博時(shí)需要遍歷所有`followees`,當(dāng)粉絲數(shù)過多時(shí)效率低下。-優(yōu)化方案:-Redis緩存:緩存用戶關(guān)注的人的最近`N`條微博,減少數(shù)據(jù)庫查詢。-分頁加載:按時(shí)間分頁返回微博,避免一次性加載過多數(shù)據(jù)。-消息隊(duì)列:發(fā)布微博時(shí)通過消息隊(duì)列通知關(guān)注者,異步更新緩存。2.題目:設(shè)計(jì)一個(gè)短鏈接生成系統(tǒng)(如`tinyurl`),要求:-輸入長(zhǎng)鏈接,返回固定長(zhǎng)度的短鏈接-支持短鏈接跳轉(zhuǎn)回長(zhǎng)鏈接-高并發(fā)下仍能快速響應(yīng)要求:-說明短鏈接生成算法-設(shè)計(jì)數(shù)據(jù)存儲(chǔ)方案-分析高并發(fā)處理方案答案:短鏈接生成算法:使用Base62編碼(包含`0-9`、`a-z`、`A-Z`共62個(gè)字符),將長(zhǎng)鏈接的URL編碼為短字符串。例如:-長(zhǎng)鏈接:`/article/12345`-轉(zhuǎn)換為數(shù)字ID:通過哈希函數(shù)(如SHA-256)生成唯一數(shù)字。-Base62編碼:將數(shù)字轉(zhuǎn)換為62進(jìn)制,補(bǔ)足固定長(zhǎng)度(如6位)。數(shù)據(jù)存儲(chǔ)方案:使用哈希表(如Redis)存儲(chǔ)`短鏈接<->長(zhǎng)鏈接`映射,確保O(1)查詢效率。高并發(fā)處理方案:1.分布式緩存:使用Redis集群緩存短鏈接映射,分?jǐn)倝毫Α?.限流:對(duì)API接口進(jìn)行限流,防止惡意攻擊。3.異步處理:通過消息隊(duì)列(如Kafka)處理生成和查詢請(qǐng)求,提高吞吐量。三、數(shù)據(jù)庫與SQL(2題,每題30分,共60分)1.題目:假設(shè)有以下數(shù)據(jù)庫表:sqlCREATETABLEOrders(OrderIDINTPRIMARYKEY,CustomerIDINT,OrderDateDATE,TotalAmountDECIMAL(10,2));CREATETABLECustomers(CustomerIDINTPRIMARYKEY,NameVARCHAR(100),CityVARCHAR(50));請(qǐng)編寫SQL查詢:-返回2023年每個(gè)城市的客戶數(shù)量及總訂單金額-按總訂單金額降序排列答案:sqlSELECTc.City,COUNT(DISTINCTo.CustomerID)ASCustomerCount,SUM(o.TotalAmount)ASTotalAmountFROMOrdersoJOINCustomerscONo.CustomerID=c.CustomerIDWHEREYEAR(o.OrderDate)=2023GROUPBYc.CityORDERBYTotalAmountDESC;解析:-使用`JOIN`連接`Orders`和`Customers`表,按城市分組統(tǒng)計(jì)客戶數(shù)量和訂單金額。-`YEAR()`函數(shù)篩選2023年訂單,`GROUPBY`聚合結(jié)果,`ORDERBY`降序排列。2.題目:請(qǐng)編寫SQL查詢:-返回每個(gè)客戶的訂單數(shù)量,且只顯示訂單數(shù)量大于10的客戶-按訂單數(shù)量升序排列答案:sqlSELECTCustomerID,COUNT()ASOrderCountFROMOrdersGROUPBYCustomerIDHAVINGCOUNT()>10ORDERBYOrderCountASC;解析:-使用`GROUPBY`統(tǒng)計(jì)每個(gè)客戶的訂單數(shù)量,`HAVING`篩選數(shù)量大于10的客戶,`ORDERBY`升序排列。四、算法與數(shù)學(xué)(2題,每題30分,共60分)1.題目:給定一個(gè)非負(fù)整數(shù)數(shù)組`nums`,返回其中三個(gè)數(shù)相加等于零的個(gè)數(shù)。例如:cppnums=[-1,0,1,2,-1,-4]輸出:3答案:cppinclude<vector>include<algorithm>intthreeSum(std::vector<int>&nums){std::sort(nums.begin(),nums.end());intn=nums.size();intcount=0;for(inti=0;i<n-2;++i){if(i>0&&nums[i]==nums[i-1])continue;intleft=i+1,right=n-1;while(left<right){intsum=nums[i]+nums[left]+nums[right];if(sum==0){count++;while(left<right&&nums[left]==nums[left+1])left++;while(left<right&&nums[right]==nums[right-1])right--;left++;right--;}elseif(sum<0){left++;}else{right--;}}}returncount;}解析:-先排序,然后固定一個(gè)數(shù),使用雙指針(`left`和`right`)查找另外兩個(gè)數(shù)使和為0。-避免重復(fù)解通過跳過相同的數(shù)。2.題目:請(qǐng)計(jì)算組合數(shù)`C(n,k)`(即從`n`個(gè)元素中選`k`個(gè)的組合數(shù)),要求不使用浮點(diǎn)數(shù)。例如:cppC(5,2)=10答案:cppinclude<iostream>intcombination(intn,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論