版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年华为软件开发面试全攻略及题库答案一、编程基础题(共5题,每题10分)1.题目:请编写一个函数,实现快速排序算法,并说明其时间复杂度和空间复杂度。答案:c++voidquickSort(intarr[],intleft,intright){if(left>=right)return;intpivot=arr[left];inti=left,j=right;while(i<j){while(i<j&&arr[j]>=pivot)j--;if(i<j)arr[i++]=arr[j];while(i<j&&arr[i]<=pivot)i++;if(i<j)arr[j--]=arr[i];}arr[i]=pivot;quickSort(arr,left,i-1);quickSort(arr,i+1,right);}解析:快速排序的平均时间复杂度为O(nlogn),最坏情况为O(n²),空间复杂度为O(logn)。2.题目:请实现一个链表反转函数,并说明其边界条件处理。答案:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextdefreverseList(head):prev=Nonecurr=headwhilecurr:next_node=curr.nextcurr.next=prevprev=currcurr=next_nodereturnprev解析:边界条件需处理空链表或单节点链表,否则可能导致空指针异常。3.题目:请编写一个函数,判断一个字符串是否为回文串(忽略大小写和空格)。答案:javapublicbooleanisPalindrome(Strings){s=s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();intleft=0,right=s.length()-1;while(left<right){if(s.charAt(left)!=s.charAt(right))returnfalse;left++;right--;}returntrue;}解析:需先处理字符串,去除非字母数字字符并统一大小写,再双指针判断。4.题目:请实现一个栈,支持在栈中查找最小元素的操作,要求时间复杂度为O(1)。答案:pythonclassMinStack:def__init__(self):self.stack=[]self.min_stack=[]defpush(self,x):self.stack.append(x)ifnotself.min_stackorx<=self.min_stack[-1]:self.min_stack.append(x)defpop(self):ifnotself.stack:returnNonetop=self.stack.pop()iftop==self.min_stack[-1]:self.min_stack.pop()returntopdefgetMin(self):ifnotself.min_stack:returnNonereturnself.min_stack[-1]解析:使用辅助栈记录最小值,每次压栈时若当前值小于等于辅助栈栈顶,则一并压入辅助栈。5.题目:请编写一个函数,实现二叉树的层序遍历(广度优先遍历)。答案:c++vector<vector<int>>levelOrder(TreeNoderoot){vector<vector<int>>result;if(!root)returnresult;queue<TreeNode>q;q.push(root);while(!q.empty()){intsize=q.size();vector<int>level;for(inti=0;i<size;i++){TreeNodenode=q.front();q.pop();level.push_back(node->val);if(node->left)q.push(node->left);if(node->right)q.push(node->right);}result.push_back(level);}returnresult;}解析:使用队列实现逐层遍历,每层遍历结束后将节点子节点入队。二、数据结构与算法题(共5题,每题15分)1.题目:请编写一个函数,实现LRU(最近最少使用)缓存,支持get和put操作。答案:pythonclassLRUCache:def__init__(self,capacity):self.capacity=capacityself.cache={}self.order=[]defget(self,key):ifkeynotinself.cache:return-1self.order.remove(key)self.order.append(key)returnself.cache[key]defput(self,key,value):ifkeyinself.cache:self.order.remove(key)eliflen(self.cache)==self.capacity:self.cache.pop(self.order.pop(0))self.cache[key]=valueself.order.append(key)解析:使用哈希表记录缓存,双向链表维护使用顺序,get时移动节点,put时先淘汰最久未使用节点。2.题目:请实现一个函数,找出数组中第三大的数,若不存在则返回最大数。答案:javapublicintthirdMax(int[]nums){Longmax1=Long.MIN_VALUE,max2=Long.MIN_VALUE,max3=Long.MIN_VALUE;for(intnum:nums){if(num==max1||num==max2||num==max3)continue;if(num>max1){max3=max2;max2=max1;max1=num;}elseif(num>max2){max3=max2;max2=num;}elseif(num>max3)max3=num;}returnmax3==Long.MIN_VALUE?max1:max3;}解析:使用三个变量记录前三大的数,遍历时更新,注意重复值需跳过。3.题目:请编写一个函数,实现字符串的剪枝,删除所有重复字符后的最小表示(如"abbac"→"abc")。答案:c++stringremoveDuplicateLetters(strings){vector<int>last(26,-1);vector<bool>inStack(26,false);stringresult="";for(inti=0;i<s.size();i++){last[s[i]-'a']=i;}for(inti=0;i<s.size();i++){charc=s[i];if(inStack[c-'a'])continue;while(!result.empty()&&c<result.back()&&i<last[result.back()-'a']){inStack[result.back()-'a']=false;result.pop_back();}result.push_back(c);inStack[c-'a']=true;}returnresult;}解析:使用栈维护结果,若当前字符已存在且小于栈顶字符,且栈顶字符在后续未出现,则弹出栈顶。4.题目:请编写一个函数,实现N皇后问题,返回所有可能的解。答案:pythondefsolveNQueens(n):defisSafe(row,col,queens):forr,cinqueens:ifc==colorabs(r-row)==abs(c-col):returnFalsereturnTruedefbacktrack(row,queens):ifrow==n:result.append(queens[:])returnforcolinrange(n):ifisSafe(row,col,queens):queens.append((row,col))backtrack(row+1,queens)queens.pop()result=[]backtrack(0,[])returnresult解析:使用回溯法,逐行放置皇后并检查列和对角线冲突,递归至N行时记录解。5.题目:请编写一个函数,实现K个一组翻转链表,返回翻转后的链表头。答案:javapublicListNodereverseKGroup(ListNodehead,intk){if(k==1||head==null)returnhead;ListNodedummy=newListNode(0);dummy.next=head;ListNodeprev=dummy,curr=dummy;while(curr!=null){for(inti=0;i<k&&curr!=null;i++)curr=curr.next;if(curr==null)break;ListNodestart=prev.next,tail=curr.next;curr.next=null;prev.next=reverseList(start);start.next=tail;prev=start;curr=prev;}returndummy.next;}privateListNodereverseList(ListNodehead){ListNodeprev=null,curr=head;while(curr!=null){ListNodenext=curr.next;curr.next=prev;prev=curr;curr=next;}returnprev;}解析:使用哑节点简化边界,每次翻转k个节点,调整指针顺序。三、系统设计题(共3题,每题20分)1.题目:请设计一个简单的微博系统,支持用户发帖、点赞、关注和获取关注者动态。答案:核心模块:-用户模块:存储用户信息(ID、昵称、关注列表、粉丝列表)。-帖子模块:存储帖子内容(ID、用户ID、时间戳、内容、点赞数)。-关系模块:存储关注关系(用户ID、关注对象ID)。-点赞模块:存储点赞记录(用户ID、帖子ID)。数据表设计:sqlCREATETABLEusers(user_idINTPRIMARYKEY,nicknameVARCHAR(50),follow_listTEXT);CREATETABLEposts(post_idINTPRIMARYKEY,user_idINT,timestampDATETIME,contentTEXT,likesINTDEFAULT0,FOREIGNKEY(user_id)REFERENCESusers(user_id));CREATETABLEfollow(user_idINT,follow_idINT,PRIMARYKEY(user_id,follow_id),FOREIGNKEY(user_id)REFERENCESusers(user_id),FOREIGNKEY(follow_id)REFERENCESusers(user_id));CREATETABLElikes(user_idINT,post_idINT,PRIMARYKEY(user_id,post_id),FOREIGNKEY(user_id)REFERENCESusers(user_id),FOREIGNKEY(post_id)REFERENCESposts(post_id));算法设计:-获取关注者动态:按时间倒序返回关注用户的最新帖子,去重合并。sqlSELECTp.content,u.nicknameFROMpostspJOINusersuONp.user_id=u.user_idJOINfollowfONp.user_id=f.follow_idWHEREf.user_id=?--当前用户IDORDERBYp.timestampDESCLIMIT20;扩展:支持分页加载、实时推送(WebSocket)。2.题目:请设计一个分布式短链接系统,要求支持高并发、高可用和快速跳转。答案:核心架构:-接入层:Nginx/HAProxy分发请求至缓存层。-缓存层:Redis集群存储短链接映射(如`long2short`、`short2long`)。-存储层:分布式数据库(如Cassandra)持久化映射关系。-CDN层:加速短链接域名解析和跳转。数据结构:redisHSETshort2longshort_urllong_urlHGETshort2longshort_url->long_url算法设计:-生成短链接:将长链接哈希(如SHA256)并截取前6位,确保唯一性。pythonimporthashlibdefgenerateShortURL(long_url):hash_obj=hashlib.sha256(long_url.encode())short_url=hash_obj.hexdigest()[:6]returnshort_url高并发优化:-缓存热点数据,热点更新时使用RedisLua脚本原子操作。-数据库分片,按URL哈希值分配。扩展:支持自定义短链接、统计点击量。3.题目:请设计一个分布式消息队列(如Kafka的简化版),支持高吞吐、可靠传输和顺序保证。答案:核心架构:-生产者:批量发送消息,支持重试机制。-消费者:拉取消息,支持单次消费确认(ACK)。-Broker:存储消息(如RocksDB),支持分区和副本。数据表设计:sqlCREATETABLEmessages(partitionINT,offsetBIGINT,timestampDATETIME,keyVARCHAR(255),valueTEXT,PRIMARYKEY(partition,offset));算法设计:-分区算法:按消息Key哈希分配分区,保证顺序性。pythonpartition=hash(key)%num_partitions-可靠传输:Broker存储多副本,消费者ACK时确认Offset。扩展:支持事务消息、延迟消息。四、数据库与存储题(共3题,每题15分)1.题目:请解释数据库索引的B+树和B-树的区别,并说明其适用场景。答案:B+树:-所有数据节点都在叶子节点,叶子节点间双向链接。-查询效率更高(顺序扫描),适合范围查询。B-树:-数据节点和索引节点混排,查询可能跳过非目标节点。-适合点查询,但范围查询效率较低。适用场景:-B+树:InnoDB索引(MySQL默认),全文索引。-B-树:堆表索引(MyISAM)。2.题目:请设计一个分库分表的方案,解决淘宝类平台百万级商品数据存储问题。答案:分库策略:-读写分离:主库负责写,从库负责读。-多活分库:按业务线分库(如商品库、订单库)。分表策略:-垂直分表:将字段拆分(如商品基本信息、详情、SKU)。-水平分表:按商品ID哈希分表(如`goods_0`,`goods_1`)。sqlCREATETABLEgoods_0(idINTPRIMARYKEY,nameVARCHAR(255),category_idINT);CREATETABLEgoods_1(idINTPRIMARYKEY,priceDECIMAL(10,2),stockINT);扩展:使用ShardingSphere做动态分库分表。3.题目:请解释数据库事务的ACID特性及其实现原理。答案:ACID特性:-原子性(Atomicity):使用Redo/Undo日志,保证事务要么全部提交要么全部回滚。-一致性(Consistency):通过锁机制和事务隔离级别(读已提交等)保证数据一致性。-隔离性(Isolation):使用MVCC(多版本并发控制)或锁(如InnoDB的Next-Key锁)。-持久性(Durability):通过WAL(Write-AheadLogging)确保事务提交后不丢失。实现原理:-Redo日志:记录已提交操作,故障时重做。-Undo日志:记录操作前状态,回滚时恢复。-锁机制:共享锁/排他锁,Next-Key锁解决幻读。五、网络与系统编程题(共3题,每题15分)1.题目:请解释TCP的三次握手和四次挥手过程,并说明为何不能合并握手/挥手。答案:三次握手:1.客户端SYN→服务器SYN+ACK→客户端ACK→连接建立-防止服务器未收到请求就发送ACK造成资源浪费。四次挥手:1.客户端FIN→服务器ACK→服务器FIN→客户端ACK→连接关闭-TCP是全双工,需分别关闭发送和接收通道。为何不能合并:-握手需确认双方时钟同步,合并会丢失时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 慢性光化性皮炎患者的营养支持策略
- 感染性心内膜炎合并脑出血的病原学与手术策略
- 物料提升机拆除安全专项施工方案
- 患者满意度提升中的医院品牌传播策略
- 制冷设备咨询服务合同
- 健康养生服务方案
- 2026年电气制造公司仓储安防监控管理制度
- 2020年大学《计算机基础》期末测试题A库100题含答案
- 游园赏景写景作文12篇
- 2025年哈尔滨市平房区辅警招聘考试试题题库附答案解析
- 水平定向钻施工组织设计方案(顶管组织设计)
- 房屋建筑和市政基础设施工程见证取样和送检工作指引(2025版)
- 副高医院药学考试试题题库及答案
- 2025年事业单位医疗卫生护理结构化面试练习题及答案
- 2023年中央金融工作会议讲稿
- 2026年质量员继续教育题库500道带答案(培优)
- GB/T 6509-2025聚己内酰胺(PA6)切片和纤维中己内酰胺及低聚物含量的测定
- 《财经应用文写作》课件-第七章 经济消息
- 2025年3D食品打印技术的食品安全标准
- 医院医疗设备可行性研究报告
- 2025湖北省重点高中自主招生数学试卷试题(含答案详解)
评论
0/150
提交评论