华为公司软件工程师面试全解及答案_第1页
华为公司软件工程师面试全解及答案_第2页
华为公司软件工程师面试全解及答案_第3页
华为公司软件工程师面试全解及答案_第4页
华为公司软件工程师面试全解及答案_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

2026年华为公司软件工程师面试全解及答案一、编程基础与数据结构(5题,每题20分,共100分)1.题目:请实现一个函数,输入一个正整数`n`,返回`n`的汉诺塔移动步骤。例如,`n=2`时,移动步骤为:移动盘子1从源塔到目标塔移动盘子2从源塔到辅助塔移动盘子1从辅助塔到目标塔移动盘子2从源塔到目标塔答案:cppinclude<iostream>include<string>voidhanoi(intn,charfrom_rod,charto_rod,charaux_rod){if(n==1){std::cout<<"移动盘子1从"<<from_rod<<"到"<<to_rod<<std::endl;return;}hanoi(n-1,from_rod,aux_rod,to_rod);std::cout<<"移动盘子"<<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`个盘子先移动到辅助塔,再移动最大的盘子到目标塔,最后将`n-1`个盘子从辅助塔移动到目标塔。递归的终止条件是只剩一个盘子时直接移动。2.题目:请实现一个函数,输入一个无重复元素的数组`nums`和一个目标值`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;}解析:使用哈希表记录每个数及其索引,遍历时计算`complement=target-nums[i]`,若`complement`已在哈希表中,则返回对应的组合。时间复杂度为`O(n)`。3.题目:请实现一个函数,输入一个字符串`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;}解析:采用回溯法生成所有子集,每次选择当前字符或不选择,逐步构建子集。时间复杂度为`O(2^n)`。4.题目:请实现一个函数,输入一个链表,返回其反转后的链表。例如: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;}解析:采用迭代法反转链表,使用三个指针`prev`、`current`和`next_node`依次反转每个节点的`next`指针。5.题目:请实现一个函数,输入一个字符串`s`,返回其最长回文子串的长度。例如: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;}解析:采用中心扩展法,遍历每个字符作为中心,分别检查奇数长度和偶数长度的回文子串,记录最大长度。二、系统设计(2题,每题50分,共100分)1.题目:设计一个简单的微博系统,需要支持以下功能:-用户发布微博(最多140字)-用户关注其他用户-用户获取自己关注的人的最新微博要求:-说明核心数据结构-描述主要模块设计-分析系统瓶颈及优化方案答案:核心数据结构:1.User:存储用户信息,包括`id`、`username`、`followers`(关注的人集合)、`followees`(自己关注的人集合)、`tweets`(发布过的微博)。2.Tweet:存储微博信息,包括`id`、`user_id`(发布者)、`content`(内容)、`timestamp`(发布时间)。主要模块设计:1.发布模块:用户发布微博时,将`Tweet`插入数据库,并更新该用户的`tweets`列表。2.关注模块:用户关注时,将对方加入`followees`,对方加入`followers`。3.获取微博模块:遍历用户`followees`,按时间倒序返回最新的`N`条微博。系统瓶颈及优化方案:-瓶颈:获取微博时需要遍历所有`followees`,当粉丝数过多时效率低下。-优化方案:-Redis缓存:缓存用户关注的人的最近`N`条微博,减少数据库查询。-分页加载:按时间分页返回微博,避免一次性加载过多数据。-消息队列:发布微博时通过消息队列通知关注者,异步更新缓存。2.题目:设计一个短链接生成系统(如`tinyurl`),要求:-输入长链接,返回固定长度的短链接-支持短链接跳转回长链接-高并发下仍能快速响应要求:-说明短链接生成算法-设计数据存储方案-分析高并发处理方案答案:短链接生成算法:使用Base62编码(包含`0-9`、`a-z`、`A-Z`共62个字符),将长链接的URL编码为短字符串。例如:-长链接:`/article/12345`-转换为数字ID:通过哈希函数(如SHA-256)生成唯一数字。-Base62编码:将数字转换为62进制,补足固定长度(如6位)。数据存储方案:使用哈希表(如Redis)存储`短链接<->长链接`映射,确保O(1)查询效率。高并发处理方案:1.分布式缓存:使用Redis集群缓存短链接映射,分摊压力。2.限流:对API接口进行限流,防止恶意攻击。3.异步处理:通过消息队列(如Kafka)处理生成和查询请求,提高吞吐量。三、数据库与SQL(2题,每题30分,共60分)1.题目:假设有以下数据库表:sqlCREATETABLEOrders(OrderIDINTPRIMARYKEY,CustomerIDINT,OrderDateDATE,TotalAmountDECIMAL(10,2));CREATETABLECustomers(CustomerIDINTPRIMARYKEY,NameVARCHAR(100),CityVARCHAR(50));请编写SQL查询:-返回2023年每个城市的客户数量及总订单金额-按总订单金额降序排列答案:sqlSELECTc.City,COUNT(DISTINCTo.CustomerID)ASCustomerCount,SUM(o.TotalAmount)ASTotalAmountFROMOrdersoJOINCustomerscONo.CustomerID=c.CustomerIDWHEREYEAR(o.OrderDate)=2023GROUPBYc.CityORDERBYTotalAmountDESC;解析:-使用`JOIN`连接`Orders`和`Customers`表,按城市分组统计客户数量和订单金额。-`YEAR()`函数筛选2023年订单,`GROUPBY`聚合结果,`ORDERBY`降序排列。2.题目:请编写SQL查询:-返回每个客户的订单数量,且只显示订单数量大于10的客户-按订单数量升序排列答案:sqlSELECTCustomerID,COUNT()ASOrderCountFROMOrdersGROUPBYCustomerIDHAVINGCOUNT()>10ORDERBYOrderCountASC;解析:-使用`GROUPBY`统计每个客户的订单数量,`HAVING`筛选数量大于10的客户,`ORDERBY`升序排列。四、算法与数学(2题,每题30分,共60分)1.题目:给定一个非负整数数组`nums`,返回其中三个数相加等于零的个数。例如: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;}解析:-先排序,然后固定一个数,使用双指针(`left`和`right`)查找另外两个数使和为0。-避免重复解通过跳过相同的数。2.题目:请计算组合数`C(n,k)`(即从`n`个元素中选`k`个的组合数),要求不使用浮点数。例如:cppC(5,2)=10答案:cppinclude<iostream>intcombination(intn,

温馨提示

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

最新文档

评论

0/150

提交评论