華為軟件開發(fā)面試題及解析_第1頁
華為軟件開發(fā)面試題及解析_第2頁
華為軟件開發(fā)面試題及解析_第3頁
華為軟件開發(fā)面試題及解析_第4頁
華為軟件開發(fā)面試題及解析_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2026年華為軟件開發(fā)面試題及解析一、編程基礎(chǔ)(5題,每題10分,共50分)1.題目:請實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)正整數(shù)`n`,返回`n`的所有質(zhì)因子的列表。例如,輸入`28`,返回`[2,2,7]`。要求不使用第三方庫,且時(shí)間復(fù)雜度盡可能低。2.題目:編寫一個(gè)函數(shù),判斷一個(gè)字符串是否為“有效括號”字符串。有效括號字符串遵循以下規(guī)則:-只包含`'('`,`')'`,`'{'`,`'}'`,`'['`,`']'`。-左括號必須與相同類型的右括號匹配。-左括號必須按正確的順序閉合。示例:`"()[]{}"`是有效的,`"(]"`是無效的。3.題目:給定一個(gè)包含`n`個(gè)整數(shù)的數(shù)組`nums`和一個(gè)目標(biāo)值`target`,請找出數(shù)組中和為`target`的兩個(gè)數(shù),并返回它們的索引。假設(shè)每個(gè)輸入都有且只有一組解,不能重復(fù)使用同一個(gè)元素。示例:`nums=[2,7,11,15],target=9`,返回`[0,1]`(因?yàn)閌nums[0]+nums[1]=2+7=9`)。4.題目:請實(shí)現(xiàn)一個(gè)簡單的LRU(LeastRecentlyUsed)緩存,使用哈希表和雙向鏈表實(shí)現(xiàn)。支持`get`和`put`操作。示例:-`LRU=LRUCache(2)`-`LRU.put(1,1)`//緩存是{1=1}-`LRU.put(2,2)`//緩存是{1=1,2=2}-`LRU.get(1)`//返回1-`LRU.put(3,3)`//去除鍵2,緩存是{1=1,3=3}-`LRU.get(2)`//返回-1(未找到)5.題目:編寫一個(gè)函數(shù),將一個(gè)字符串中的所有大寫字母轉(zhuǎn)換為小寫字母,所有小寫字母轉(zhuǎn)換為大寫字母,其他字符保持不變。示例:`"HelloWorld!"`轉(zhuǎn)換為`"hELLOwORLD!"`。二、數(shù)據(jù)結(jié)構(gòu)與算法(5題,每題10分,共50分)1.題目:給定一個(gè)無重復(fù)元素的整數(shù)數(shù)組`nums`,返回該數(shù)組所有可能的子集。示例:`nums=[1,2,3]`,返回`[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]`。2.題目:請實(shí)現(xiàn)一個(gè)二叉樹的深度優(yōu)先遍歷(前序、中序、后序),并分別用遞歸和迭代的方式實(shí)現(xiàn)。示例:給定二叉樹`[3,9,20,null,null,15,7]`,前序遍歷為`[3,9,20,15,7]`。3.題目:設(shè)計(jì)一個(gè)算法,找出數(shù)組中第三大的數(shù)。如果數(shù)組中少于三個(gè)不同的數(shù),返回最大的數(shù)。示例:`nums=[2,2,3,1]`,返回`2`;`nums=[1,2,-2147483648]`,返回`-2147483648`。4.題目:請實(shí)現(xiàn)一個(gè)函數(shù),檢查一個(gè)鏈表是否為回文鏈表。示例:給定鏈表`1->2->2->1`,返回`true`。5.題目:給定一個(gè)字符串`s`和一個(gè)整數(shù)`k`,找到長度為`k`的子字符串,使得該子字符串中的字符種類最多。示例:`s="aabbcc",k=2`,返回`"bcb"`(字符種類最多,包含`a`和`b`)。三、系統(tǒng)設(shè)計(jì)與架構(gòu)(3題,每題20分,共60分)1.題目:設(shè)計(jì)一個(gè)高并發(fā)的短鏈接系統(tǒng)。要求:-輸入任意長度的URL,輸出固定長度的短鏈接(如`/abc123`)。-支持高并發(fā)訪問和快速跳轉(zhuǎn)。-提供冪等性,即相同的輸入始終返回相同的短鏈接。2.題目:設(shè)計(jì)一個(gè)分布式限流系統(tǒng),支持全局限流和本地限流。要求:-使用Redis或其他緩存實(shí)現(xiàn),支持配置不同的限流策略(如令牌桶、漏桶)。-提供可視化的限流統(tǒng)計(jì)(如當(dāng)前窗口內(nèi)的請求次數(shù)、剩余容量)。3.題目:設(shè)計(jì)一個(gè)高可用的消息隊(duì)列系統(tǒng)(如Kafka或RabbitMQ),要求:-支持至少三個(gè)節(jié)點(diǎn)的集群部署,自動故障轉(zhuǎn)移。-提供消息的持久化、順序保證和重復(fù)消費(fèi)處理。-支持消費(fèi)者組模式,允許多個(gè)消費(fèi)者同時(shí)消費(fèi)不同分區(qū)。四、數(shù)據(jù)庫與分布式(3題,每題20分,共60分)1.題目:設(shè)計(jì)一個(gè)用戶表(`users`),包含以下字段:-`id`(主鍵,自增)-`username`(唯一,不能重復(fù))-`email`(唯一,必須驗(yàn)證格式)-`password`(加密存儲,要求使用哈希算法)-`create_time`(自動生成時(shí)間戳)-`update_time`(自動更新時(shí)間戳)要求:-使用MySQL或PostgreSQL,編寫創(chuàng)建表的SQL語句。-提供索引設(shè)計(jì)建議,優(yōu)化查詢性能。2.題目:假設(shè)一個(gè)電商系統(tǒng)需要支持海量訂單的實(shí)時(shí)查詢和統(tǒng)計(jì),請?jiān)O(shè)計(jì)以下功能:-使用分布式數(shù)據(jù)庫(如ClickHouse或Druid)存儲訂單數(shù)據(jù)。-支持按時(shí)間范圍、用戶ID、商品ID等條件查詢訂單。-如何保證查詢的實(shí)時(shí)性和數(shù)據(jù)的準(zhǔn)確性?3.題目:設(shè)計(jì)一個(gè)分布式事務(wù)解決方案,要求:-支持至少兩個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)一致性(如用戶下單和庫存扣減)。-提供補(bǔ)償機(jī)制,處理事務(wù)失敗的情況。-限制事務(wù)的延遲和資源消耗。五、網(wǎng)絡(luò)與安全(3題,每題20分,共60分)1.題目:假設(shè)一個(gè)移動應(yīng)用需要通過WebSocket實(shí)現(xiàn)實(shí)時(shí)消息推送,請?jiān)O(shè)計(jì)以下功能:-使用WebSocket協(xié)議,如何保證消息的可靠傳輸?-如何處理客戶端離線的情況(如使用長連接或重連機(jī)制)?-如何防止消息泄露和偽造?2.題目:設(shè)計(jì)一個(gè)防止SQL注入的解決方案,要求:-使用參數(shù)化查詢或ORM框架。-提供額外的安全措施(如輸入校驗(yàn)、白名單限制)。-如何監(jiān)控和審計(jì)SQL注入攻擊?3.題目:假設(shè)一個(gè)API接口需要防止惡意請求,請?jiān)O(shè)計(jì)以下功能:-使用JWT或OAuth2.0進(jìn)行身份驗(yàn)證。-限制請求頻率(如使用Redis或限流中間件)。-如何防止DDoS攻擊?答案與解析一、編程基礎(chǔ)1.答案:pythondefprime_factors(n):factors=[]處理2的因子whilen%2==0:factors.append(2)n//=2處理奇數(shù)因子foriinrange(3,int(n0.5)+1,2):whilen%i==0:factors.append(i)n//=i如果n是質(zhì)數(shù)ifn>2:factors.append(n)returnfactors解析:-首先處理`2`的因子,因?yàn)閌2`是唯一的偶數(shù)質(zhì)數(shù)。-然后從`3`開始,以`2`的步長遍歷所有奇數(shù),直到`sqrt(n)`。-如果最后`n`大于`2`,則`n`本身是質(zhì)數(shù)。-時(shí)間復(fù)雜度為`O(sqrt(n))`,適合大數(shù)分解。2.答案:pythondefisValid(s):stack=[]mapping={')':'(','}':'{',']':'['}forcharins:ifcharinmapping.values():stack.append(char)elifcharinmapping:ifnotstackorstack[-1]!=mapping[char]:returnFalsestack.pop()else:returnFalsereturnnotstack解析:-使用棧存儲左括號,遇到右括號時(shí)檢查棧頂是否匹配。-時(shí)間復(fù)雜度為`O(n)`,空間復(fù)雜度為`O(n)`。3.答案:pythondeftwoSum(nums,target):num_to_index={}fori,numinenumerate(nums):complement=target-numifcomplementinnum_to_index:return[num_to_index[complement],i]num_to_index[num]=ireturn[]解析:-使用哈希表記錄每個(gè)數(shù)的索引,時(shí)間復(fù)雜度為`O(n)`。-遍歷數(shù)組時(shí),檢查`target-num`是否已存在。4.答案:pythonclassDLinkedNode:def__init__(self,key=None,value=None):self.key=keyself.value=valueself.prev=Noneself.next=NoneclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.head,self.tail=DLinkedNode(),DLinkedNode()self.head.next=self.tailself.tail.prev=self.headdefget(self,key:int)->int:ifkeynotinself.cache:return-1node=self.cache[key]self._move_to_head(node)returnnode.valuedefput(self,key:int,value:int)->None:ifkeyinself.cache:node=self.cache[key]node.value=valueself._move_to_head(node)else:node=DLinkedNode(key,value)self.cache[key]=nodeself._add_node(node)iflen(self.cache)>self.capacity:tail=self._pop_tail()delself.cache[tail.key]returndef_move_to_head(self,node):self._remove_node(node)self._add_node(node)def_add_node(self,node):node.prev=self.headnode.next=self.head.nextself.head.next.prev=nodeself.head.next=nodedef_remove_node(self,node):prev_node=node.prevnext_node=node.nextprev_node.next=next_nodenext_node.prev=prev_nodedef_pop_tail(self):res=self.tail.prevself._remove_node(res)returnres解析:-使用雙向鏈表記錄訪問順序,頭節(jié)點(diǎn)為最近訪問,尾節(jié)點(diǎn)為最久未訪問。-`get`操作將節(jié)點(diǎn)移到頭節(jié)點(diǎn),`put`操作新建節(jié)點(diǎn)或更新節(jié)點(diǎn)并移到頭節(jié)點(diǎn)。-超出容量時(shí)刪除尾節(jié)點(diǎn)。5.答案:pythondefswap_case(s:str)->str:return''.join([char.lower()ifchar.isupper()elsechar.upper()forcharins])解析:-遍歷字符串,將大寫字母轉(zhuǎn)換為小寫,小寫轉(zhuǎn)換為大寫。-時(shí)間復(fù)雜度為`O(n)`,空間復(fù)雜度為`O(n)`。二、數(shù)據(jù)結(jié)構(gòu)與算法1.答案:pythondefsubsets(nums):res=[]subset=[]defbacktrack(start):res.append(subset.copy())foriinrange(start,len(nums)):subset.append(nums[i])backtrack(i+1)subset.pop()backtrack(0)returnres解析:-使用回溯法生成所有子集,`start`表示當(dāng)前選擇的起始位置。-每次選擇一個(gè)數(shù)加入`subset`,然后遞歸繼續(xù)選擇。-時(shí)間復(fù)雜度為`O(2^n)`,空間復(fù)雜度為`O(n)`。2.答案:python前序遍歷(遞歸)defpreorder_recursive(root):ifnotroot:return[]return[root.val]+preorder_recursive(root.left)+preorder_recursive(root.right)前序遍歷(迭代)defpreorder_iterative(root):ifnotroot:return[]stack,res=[root],[]whilestack:node=stack.pop()res.append(node.val)ifnode.right:stack.append(node.right)ifnode.left:stack.append(node.left)returnres中序遍歷(遞歸)definorder_recursive(root):ifnotroot:return[]returninorder_recursive(root.left)+[root.val]+inorder_recursive(root.right)中序遍歷(迭代)definorder_iterative(root):stack,res=[],[]whilestackorroot:whileroot:stack.append(root)root=root.leftroot=stack.pop()res.append(root.val)root=root.rightreturnres后序遍歷(遞歸)defpostorder_recursive(root):ifnotroot:return[]returnpostorder_recursive(root.left)+postorder_recursive(root.right)+[root.val]后序遍歷(迭代)defpostorder_iterative(root):ifnotroot:return[]stack,res=[(root,False)],[]whilestack:node,visited=stack.pop()ifnode:ifvisited:res.append(node.val)else:stack.append((node,True))stack.append((node.right,False))stack.append((node.left,False))returnres解析:-遞歸方法直觀,但可能棧溢出。迭代方法使用顯式棧,避免遞歸深度限制。-后序遍歷的迭代方法較復(fù)雜,需記錄訪問狀態(tài)。3.答案:pythondefthird_max(nums):first,second,third=float('-inf'),float('-inf'),float('-inf')fornuminnums:ifnum>first:third,second,first=second,first,numeliffirst>num>second:third,second=second,numelifsecond>num>third:third=numreturnfirstifthird!=float('-inf')elsesecond解析:-維護(hù)三個(gè)變量記錄前三大的數(shù)。遍歷時(shí)更新這三個(gè)變量。-時(shí)間復(fù)雜度為`O(n)`,空間復(fù)雜度為`O(1)`。4.答案:pythondefisPalindrome(head):slow=fast=headwhilefastandfast.next:slow=slow.nextfast=fast.next.next反轉(zhuǎn)后半部分prev=Nonewhileslow:tmp=slow.nextslow.next=prevprev=slowslow=tmp比較前后半部分left,right=head,prevwhileright:#只需比較一半ifleft.val!=right.val:returnFalseleft=left.nextright=right.nextreturnTrue解析:-快慢指針找到中點(diǎn),反轉(zhuǎn)后半部分,然后比較前后半部分是否相同。-時(shí)間復(fù)雜度為`O(n)`,空間復(fù)雜度為`O(1)`。5.答案:pythondefmost_common_substring(s:str,k:int)->str:fromcollectionsimportdefaultdictmax_count=0max_sub=""foriinrange(len(s)-k+1):substring=s[i:i+k]count=len(set(substring))ifcount>max_count:max_count=countmax_sub=substringreturnmax_sub解析:-遍歷所有長度為`k`的子字符串,統(tǒng)計(jì)字符種類。-選擇種類最多的子字符串。-時(shí)間復(fù)雜度為`O(nk)`,空間復(fù)雜度為`O(k)`。三、系統(tǒng)設(shè)計(jì)與架構(gòu)1.答案:-短鏈接生成:使用哈希函數(shù)(如MD5或SHA-256)將長URL映射為固定長度的短碼(如`6`位字母數(shù)字組合)。-存儲:將短碼和長URL存儲在Redis中,設(shè)置過期時(shí)間(如1年)。-高并發(fā):使用分布式緩存(如RedisCluster)和負(fù)載均衡(如Nginx),支持緩存預(yù)熱和異地多活。-冪等性:使用UUID或請求ID作為緩存鍵的一部分,確保相同請求返回相同短碼。2.答案:-令牌桶算法:-維護(hù)一個(gè)桶,每次請求允許放一個(gè)令牌。桶滿后拒絕請求。-令牌按固定速率放入桶。-Redis實(shí)現(xiàn):-使用Redis的`SETNX`或`EXPIRE`實(shí)現(xiàn)令牌的定時(shí)放入。-使用Lua腳本保證原子性。-本地限流:每個(gè)服務(wù)實(shí)例維護(hù)本地計(jì)數(shù)器,結(jié)合分布式鎖實(shí)現(xiàn)。3.答案:-集群部署:-使用Kafka或RabbitMQ的多節(jié)點(diǎn)集群,配置ISR(In-SyncReplicas)保證高可用。-使用ZK或etcd進(jìn)行元數(shù)據(jù)管理。-消息持久化:-生產(chǎn)者設(shè)置`acks=all`,確保消息寫入所有副本。-消息寫入磁盤,避免內(nèi)存溢出。-消費(fèi)者組:-消費(fèi)者組內(nèi)消息按分區(qū)均勻分配。-處理重復(fù)消費(fèi):使用冪等鍵或事務(wù)。四、數(shù)據(jù)庫與分布式1.答案:sqlCREATETABLEusers(idBIGINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)UNIQUENOTNULL,emailVARCHAR(100)UNIQUENOTNULL,passwordVARCHAR(255)NOTNULL,--存儲哈希值create_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,update_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,INDEXidx_username(username),INDEXidx_email(email))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;解析:-`id

溫馨提示

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

最新文檔

評論

0/150

提交評論