华为软件开发面试题集与解析_第1页
华为软件开发面试题集与解析_第2页
华为软件开发面试题集与解析_第3页
华为软件开发面试题集与解析_第4页
华为软件开发面试题集与解析_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年华为软件开发面试题集与解析一、编程语言与数据结构(共5题,每题10分,总分50分)1.题目:请实现一个函数,输入一个非负整数`n`,返回`n`的二进制表示中`1`的个数。例如,输入`11`(二进制为`1011`),返回`3`。解析:-位运算方法:通过不断与`1`进行`&`运算并右移,统计`1`的个数。-时间复杂度:`O(logn)`。2.题目:给定一个无重复元素的数组`nums`和一个目标值`target`,请找出数组中和为目标值的一对数,并返回它们的索引。例如,输入`nums=[2,7,11,15]`,`target=9`,返回`[0,1]`(因为`nums[0]+nums[1]=9`)。解析:-哈希表方法:使用哈希表记录每个元素的值和索引,避免重复遍历。-时间复杂度:`O(n)`。3.题目:请实现一个`LRU`缓存(LeastRecentlyUsed),支持`get`和`put`操作。`get(key)`返回键对应的值,如果不存在返回`-1`;`put(key,value)`将键值对插入缓存,如果键已存在则更新值,并使该键成为最近使用。解析:-使用双向链表和哈希表结合实现:哈希表存储键和链表节点的映射,链表维护最近使用顺序。-时间复杂度:`O(1)`。4.题目:给定一个字符串`s`,请判断它是否是`z`字形排列。例如,输入`"LEETCODE"`,如果排列为`L-C-E-T-O-D-E`,则返回`true`。解析:-通过模拟`z`字形遍历,检查字符是否按行对齐。-时间复杂度:`O(n)`。5.题目:请实现一个函数,将一个字符串中的每个空格替换为`%20`。例如,输入`"Wearehappy."`,返回`"We%20are%20happy."`。解析:-双指针方法:从前向后遍历,避免重复修改字符串。-时间复杂度:`O(n)`。二、算法与设计(共4题,每题15分,总分60分)1.题目:请设计一个算法,找出数组中第三大的数。例如,输入`[1,2,2,5,3,5]`,返回`2`。解析:-维护三个变量记录前三大的数,遍历数组更新。-时间复杂度:`O(n)`。2.题目:请实现一个函数,检查一个链表是否为回文链表。例如,输入`1->2->2->1`,返回`true`。解析:-快慢指针找中点,反转后半部分,比较是否相同。-时间复杂度:`O(n)`。3.题目:请设计一个算法,找出数组中重复次数超过`n/3`的数。例如,输入`[1,2,3,1,1]`,返回`[1]`。解析:-哈希表统计频率,或摩尔投票法(需扩展为三重计数)。-时间复杂度:`O(n)`。4.题目:请实现一个函数,将一个非递减排序数组转换为高度平衡的二叉搜索树。例如,输入`[1,2,3,4,5,6,7]`,返回`[4,2,6,1,3,5,7]`的二叉树。解析:-递归方法:取中点为根,左右子数组分别构建左右子树。-时间复杂度:`O(n)`。三、系统设计(共3题,每题20分,总分60分)1.题目:请设计一个秒杀系统,支持高并发场景下的商品秒杀功能。解析:-关键点:分布式锁、数据库事务(乐观锁/悲观锁)、消息队列削峰填谷。-需考虑库存锁定、超卖问题。2.题目:请设计一个短链接系统,将长链接转换为短链接,并支持跳转。解析:-关键点:哈希算法(如Base62)生成短链接、数据库存储映射关系、缓存加速查询。-需考虑唯一性、可扩展性。3.题目:请设计一个分布式计数器系统,支持高并发自增。解析:-关键点:Redis的`INCR`命令、分布式锁、数据库分表分库。-需考虑幂等性、数据一致性。四、数据库与分布式(共4题,每题15分,总分60分)1.题目:请解释数据库事务的ACID特性,并举例说明。解析:-ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。-例如:银行转账需要原子性保证资金不丢失。2.题目:请比较MySQL的InnoDB和MyISAM存储引擎的优缺点。解析:-InnoDB:支持事务、行级锁、外键;MyISAM:非事务、表级锁、更快的查询。-适用于不同场景,如高并发选InnoDB。3.题题:请解释分布式数据库的CAP理论,并举例说明。解析:-CAP:一致性(Consistency)、可用性(Availability)、分区容错性(PartitionTolerance)。-例如:Twitter采用最终一致性。4.题目:请设计一个高可用的分布式数据库架构。解析:-关键点:主从复制、读写分离、多副本部署、故障切换。-可参考MySQL集群或MongoDB集群方案。五、网络与中间件(共3题,每题20分,总分60分)1.题目:请解释TCP的三次握手和四次挥手过程。解析:-三次握手:建立连接,同步序列号。-四次挥手:关闭连接,确认收发。-需考虑延迟确认和TIME_WAIT状态。2.题目:请比较Redis和Memcached的区别,并说明适用场景。解析:-Redis:支持事务、持久化、更丰富的数据类型;Memcached:纯内存,更简单。-Redis适用于复杂场景,Memcached适用于高速缓存。3.题目:请设计一个基于Kafka的高吞吐量消息系统。解析:-关键点:分区实现并发、副本保证容错、消费者组实现广播/聚合。-需考虑消息顺序、重复消费问题。答案与解析一、编程语言与数据结构1.二进制中`1`的个数:cppintcountBits(intn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}解析:位运算`n&1`检查最低位是否为`1`,右移`n>>=1`跳过当前位。2.和为`target`的两数索引:cppvector<int>twoSum(vector<int>&nums,inttarget){unordered_map<int,int>map;for(inti=0;i<nums.size();++i){if(map.find(target-nums[i])!=map.end()){return{map[target-nums[i]],i};}map[nums[i]]=i;}return{};}解析:哈希表记录每个数的索引,避免二次遍历。3.LRU缓存:cppclassLRUCache{public:LRUCache(intcapacity):capacity(capacity){}intget(intkey){if(map.find(key)==map.end())return-1;autoit=map[key];cache.erase(it);cache.emplace_front(key,it->second);map[key]=cache.begin();returnit->second;}voidput(intkey,intvalue){if(map.find(key)!=map.end()){cache.erase(map[key]);}cache.emplace_front(key,value);map[key]=cache.begin();if(cache.size()>capacity){intk=cache.back().first;cache.pop_back();map.erase(k);}}private:intcapacity;list<pair<int,int>>cache;unordered_map<int,list<pair<int,int>>::iterator>map;};解析:双向链表维护顺序,哈希表快速定位。4.Z字形排列:cppboolisZigzag(strings){introw=0,dir=1;unordered_map<int,char>map;for(inti=0;i<s.size();++i){map[row]=s[i];row+=dir;if(row==0||row==1)dir=1;elsedir=-1;}//检查每行的字符是否相同unordered_set<char>set1,set2;for(autop:map){if(p.first==0)set1.insert(p.second);elseset2.insert(p.second);}returnset1.size()==1&&set2.size()==1;}解析:模拟`z`形遍历,分行记录字符,最后检查每行是否唯一。5.空格替换为`%20`:cppstringreplaceSpaces(strings){intcount=0;for(charc:s)if(c=='')count++;intn=s.size();s.resize(n+count2);for(inti=n-1,j=s.size()-1;i>=0;--i,--j){if(s[i]==''){s[j--]='0';s[j--]='2';s[j]='%';}else{s[j]=s[i];}}returns;}解析:双指针法,先统计空格数量,再从后向前替换。二、算法与设计1.第三大的数:cppintthirdMax(vector<int>&nums){longa=LONG_MIN,b=LONG_MIN,c=LONG_MIN;for(intnum:nums){if(num==a||num==b||num==c)continue;if(num>a){c=b;b=a;a=num;}elseif(num>b){c=b;b=num;}elseif(num>c)c=num;}returnc==LONG_MIN?a:c;}解析:维护三个变量更新前三大的数,避免重复。2.回文链表:cppboolisPalindrome(ListNodehead){ListNodeslow=head,fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}ListNodeprev=nullptr,next=nullptr;while(slow){next=slow->next;slow->next=prev;prev=slow;slow=next;}while(prev&&head){if(prev->val!=head->val)returnfalse;prev=prev->next;head=head->next;}returntrue;}解析:快慢指针找中点,反转后半部分,逐个比较。3.重复次数超过`n/3`的数:cppvector<int>majorityElement(vector<int>&nums){intcnt1=0,cnt2=0,num1=0,num2=0;for(intnum:nums){if(num==num1)cnt1++;elseif(num==num2)cnt2++;elseif(cnt1==0){num1=num;cnt1=1;}elseif(cnt2==0){num2=num;cnt2=1;}else{cnt1--;cnt2--;}}vector<int>res;cnt1=cnt2=0;for(intnum:nums){if(num==num1)cnt1++;elseif(num==num2)cnt2++;}if(cnt1>nums.size()/3)res.push_back(num1);if(cnt2>nums.size()/3)res.push_back(num2);returnres;}解析:扩展摩尔投票法,记录两个候选和其计数。4.非递减数组转高度平衡二叉搜索树:cppTreeNodesortedArrayToBST(vector<int>&nums){if(nums.empty())returnnullptr;returnbuild(nums,0,nums.size()-1);}TreeNodebuild(vector<int>&nums,intleft,intright){if(left>right)returnnullptr;intmid=left+(right-left)/2;TreeNoderoot=newTreeNode(nums[mid]);root->left=build(nums,left,mid-1);root->right=build(nums,mid+1,right);returnroot;}解析:递归构建,中点为根,左右子数组分别构建子树。三、系统设计1.秒杀系统设计:-数据库:使用乐观锁(版本号)或悲观锁(行锁)防止超卖。-缓存:Redis缓存库存,热点商品预减库存。-消息队列:Kafka削峰填谷,防止突发请求。2.短链接系统设计:-哈希算法:Base62编码,如`/a1b2c3`。-存储:Redis记录映射关系,分布式部署。-安全:加密长链接,防止恶意伪造。3.分布式计数器设计:-Redis:使用`INCR`命令,高可用集群部署。-数据库:分表分库,如MySQL分库键设计。-锁:分布式锁(如RedisSETNX)保证一致性。四、数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论