版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年华为技术面试题:软件工程师岗位解析一、编程基础(5题,每题10分,共50分)1.题目:请用C++实现一个函数,输入一个整数数组,返回数组中所有奇数数字的乘积。如果数组为空或所有数字为偶数,返回0。示例:输入:`[1,2,3,4]`→输出:`3`(因为13=3)输入:`[2,4,6]`→输出:`0`输入:`[]`→输出:`0`答案:cppinclude<vector>include<iostream>longlongproductOfOdds(conststd::vector<int>&nums){longlongproduct=1;boolhasOdd=false;for(intnum:nums){if(num%2!=0){product=num;hasOdd=true;}}returnhasOdd?product:0;}intmain(){std::vector<int>test1={1,2,3,4};std::vector<int>test2={2,4,6};std::vector<int>test3={};std::cout<<productOfOdds(test1)<<std::endl;//输出3std::cout<<productOfOdds(test2)<<std::endl;//输出0std::cout<<productOfOdds(test3)<<std::endl;//输出0return0;}解析:-遍历数组,判断每个数字是否为奇数(`num%2!=0`)。-如果是奇数,乘以`product`并标记`hasOdd`为`true`。-遍历结束后,如果`hasOdd`为`true`,返回`product`;否则返回0。-注意使用`longlong`避免大数溢出。2.题目:请用Java实现一个方法,将一个字符串中的所有空格替换为`%20`。不使用内置的`replace`方法。示例:输入:`"HelloWorld"`→输出:`"Hello%20World"`输入:`"leadingspaces"`→输出:`"%20leading%20spaces"`答案:javapublicclassURLify{publicstaticStringreplaceSpaces(Strings,inttrueLength){StringBuildersb=newStringBuilder();for(inti=0;i<trueLength;i++){if(s.charAt(i)==''){sb.append("%20");}else{sb.append(s.charAt(i));}}returnsb.toString();}publicstaticvoidmain(String[]args){Stringtest1="HelloWorld";Stringtest2="leadingspaces";System.out.println(replaceSpaces(test1,11));//输出Hello%20WorldSystem.out.println(replaceSpaces(test2,15));//输出%20leading%20spaces}}解析:-使用`StringBuilder`高效构建新字符串。-遍历输入字符串的前`trueLength`个字符(忽略尾随空格)。-遇到空格时替换为`%20`,否则直接追加字符。-时间复杂度O(N),空间复杂度O(N)。3.题目:请用Python实现一个函数,输入一个正整数`n`,返回它的二进制表示中`1`的个数。示例:输入:`9`→输出:`2`(因为9的二进制是`1001`,有2个1)输入:`0`→输出:`0`输入:`1023`→输出:`9`(因为1023的二进制是`1111111111`,有9个1)答案:pythondefcount_bits(n):count=0whilen:count+=n&1n>>=1returncount测试print(count_bits(9))#输出2print(count_bits(0))#输出0print(count_bits(1023))#输出9解析:-使用位运算`n&1`判断最低位是否为1。-每次右移一位(`n>>=1`),直到`n`为0。-时间复杂度O(logN),空间复杂度O(1)。4.题目:请用C#实现一个类,包含一个方法`RemoveDuplicates`,输入一个链表,返回删除重复节点后的链表。假设链表节点值唯一。示例:输入:`1->2->3->3->2->1`→输出:`1->2->3`答案:csharppublicclassListNode{publicintval;publicListNodenext;publicListNode(intval=0,ListNodenext=null){this.val=val;this.next=next;}}publicclassSolution{publicListNodeRemoveDuplicates(ListNodehead){ListNodecurrent=head;while(current!=null){ListNoderunner=current;while(runner.next!=null){if(runner.next.val==current.val){runner.next=runner.next.next;}else{runner=runner.next;}}current=current.next;}returnhead;}}解析:-使用快慢指针法,`current`为当前节点,`runner`为快指针。-遍历`current`的后续节点,如果与`current`值相同,则删除。-时间复杂度O(N^2),空间复杂度O(1)。5.题目:请用Go实现一个函数,输入一个字符串,返回它的所有子串。示例:输入:`"abc"`→输出:`["","a","ab","abc","b","bc","c"]`答案:gopackagemainimport("fmt""strings")funcsubstrings(sstring)[]string{n:=len(s)varres[]stringfori:=0;i<n;i++{forj:=i+1;j<=n;j++{res=append(res,s[i:j])}}returnres}funcmain(){fmt.Println(substrings("abc"))//输出["","a","ab","abc","b","bc","c"]}解析:-使用两层循环遍历所有可能的子串。-外层循环确定子串起点`i`,内层循环确定终点`j`。-将子串`s[i:j]`加入结果列表。-时间复杂度O(N^2),空间复杂度O(N^2)。二、系统设计(2题,每题25分,共50分)1.题目:设计一个简单的微博系统,要求支持以下功能:-用户注册、登录(使用邮箱和密码)。-发布微博(每条微博最多1000字符)。-关注/取消关注用户。-判断是否关注了某用户。-获取某个用户的粉丝列表。-获取某个用户的关注列表。-获取某个用户的动态(包括自己发布的和关注的人发布的,按时间倒序)。要求:-描述核心数据结构。-描述主要接口设计。-说明如何支持动态按时间倒序获取。答案:核心数据结构:-User:-`id`:用户ID(唯一)-`email`:邮箱(唯一)-`password`:密码(加密存储)-`followers`:粉丝列表(User类型)-`following`:关注列表(User类型)-Tweet:-`id`:微博ID(唯一)-`userId`:发布者ID(关联User)-`content`:内容(字符串,最多1000字符)-`timestamp`:发布时间(时间戳)主要接口设计:-注册:`register(email,password)`→创建User对象并存储。-登录:`login(email,password)`→验证密码返回Token。-发布微博:`postTweet(userId,content)`→创建Tweet对象并关联User。-关注:`follow(userId,targetId)`→将`targetId`加入`userId`的`following`。-取消关注:`unfollow(userId,targetId)`→从`userId`的`following`中移除`targetId`。-获取粉丝列表:`getFollowers(userId)`→返回`userId`的`followers`。-获取关注列表:`getFollowing(userId)`→返回`userId`的`following`。-获取动态:`getTimeline(userId)`→返回按时间倒序的Tweet列表。动态按时间倒序获取实现:-用户动态包含自己和关注的人发布的所有微博。-可以使用Redis有序集合(ZSet)存储Tweet的`timestamp`作为分数,按分数倒序获取最近动态。-或者使用数据库索引按时间戳倒序查询。解析:-系统核心是User和Tweet的关联。-关注关系使用双向列表存储,支持快速判断是否关注。-动态获取需要合并自己和关注的人的Tweet,按时间倒序排序。-使用Redis或数据库索引可以高效实现倒序获取。2.题目:设计一个短链接系统,要求:-输入长链接,生成短链接(如`/abc123`)。-根据短链接返回对应的长链接。-支持高并发访问。-短链接唯一且易于记忆。要求:-描述核心数据结构。-描述生成短链接的算法。-说明如何支持高并发。答案:核心数据结构:-Link:-`id`:唯一标识(如UUID或自增ID)-`longUrl`:长链接-`shortCode`:短链接码(如`abc123`)-`createdAt`:创建时间生成短链接的算法:1.对`longUrl`进行哈希(如SHA-256)生成原始短码。2.压缩短码(如使用62进制字符`a-z0-9A-Z`),如将`abcd`转为`1234`。3.确保短码唯一性,如果冲突则重新生成。示例:-原始哈希:`abcd`→压缩:`1234`→短链接:`/1234`支持高并发的方案:-数据库:使用高可用MySQL/PostgreSQL集群存储`Link`表,开启读写分离。-缓存:使用Redis缓存热点短链接的`longUrl`,减少数据库压力。-分布式锁:生成短链接时使用Redis分布式锁防止并发冲突。-异步写入:使用消息队列(如Kafka)处理生成请求,数据库异步更新。解析:-核心是`Link`表存储长链接和短链接码的映射。-短链接生成需要保证唯一性和易记性,可以使用哈希+压缩算法。-高并发通过数据库集群、缓存、分布式锁和异步处理实现。三、数据库(2题,每题25分,共50分)1.题目:假设有一个订单表`Orders`,字段:`id`(主键)、`userId`、`productId`、`amount`(订单金额)、`orderTime`(订单时间)。请写出以下SQL查询:-查询每个用户的总消费金额。-查询每个用户的订单数量。-查询金额最高的订单。-查询最近一个月内的订单数量。答案:1.查询每个用户的总消费金额:sqlSELECTuserId,SUM(amount)AStotalSpentFROMOrdersGROUPBYuserId;2.查询每个用户的订单数量:sqlSELECTuserId,COUNT()ASorderCountFROMOrdersGROUPBYuserId;3.查询金额最高的订单:sqlSELECTid,userId,productId,amount,orderTimeFROMOrdersORDERBYamountDESCLIMIT1;4.查询最近一个月内的订单数量:sqlSELECTCOUNT()FROMOrdersWHEREorderTime>=NOW()-INTERVAL1MONTH;解析:-使用`GROUPBY`按`userId`分组,聚合金额或数量。-使用`ORDERBY`和`LIMIT`获取最高金额订单。-使用`INTERVAL`计算时间范围。2.题目:设计一个商品表`Products`,字段:`id`(主键)、`name`、`category`、`price`、`stock`(库存)。请写出以下SQL查询:-查询价格在100到200之间的商品,按价格升序排列。-查询库存不足10的商品,按库存降序排列。-查询每个分类的商品数量。-查询价格最高的前5个商品。答案:1.查询价格在100到200之间的商品,按价格升序排列:sqlSELECTid,name,category,price,stockFROMProductsWHEREpriceBETWEEN100AND200ORDERBYpriceASC;2.查询库存不足10的商品,按库存降序排列:sqlSELECTid,name,category,price,stockFROMProductsWHEREstock<10ORDERBYstockDESC;3.查询每个分类的商品数量:sqlSELECTcategory,COUNT()ASproductCountFROMProductsGROUPBYcategory;4.查询价格最高的前5个商品:sqlSELECTid,name,category,price,stockFROMProductsORDERBYpriceDESCLIMIT5;解析:-使用`BETWEEN`和`ORDERBY`筛选价格范围和排序。-使用`WHERE`和`ORDERBY`筛选库存不足的商品。-使用`GROUPBY`按分类统计商品数量。-使用`ORDERBY`和`LIMIT`获取前N个高价商品。四、算法与数据结构(3题,每题20分,共60分)1.题目:请用Python实现快速排序算法,输入一个整数数组,返回排序后的数组。答案:pythondefquicksort(arr):iflen(arr)<=1:returnarrpivot=arr[len(arr)//2]left=[xforxinarrifx<pivot]middle=[xforxinarrifx==pivot]right=[xforxinarrifx>pivot]returnquicksort(left)+middle+quicksort(right)测试print(quicksort([3,6,8,10,1,2,1]))#输出[1,1,2,3,6,8,10]解析:-选择基准值`pivot`(中间值)。-将数组分为`left`(小于基准)、`middle`(等于基准)、`right`(大于基准)。-递归对`left`和`right`排序,合并结果。2.题目:请用Java实现一个方法,输入一个整数数组,返回其中重复次数超过`n/2`的元素(假设一定存在)。示例:输入:`[2,2,1,1,1,2,2]`→输出:`2`答案:javapublicclassMajorityElement{publicintmajorityElement(int[]nums){intcount=0;Integercandidate=null;for(intnum:nums){if(count==0){candidate=num;}count+=(num==candidate)?1:-1;}returncandidate;}publicstaticvoidmain(String[]args){MajorityElementme=newMajorityElement();System.out.println(me.majorityElement(newint[]{2,2,1,1,1,2,2}));//输出2}}解析:-Boyer-Moore投票算法:-初始化计数器`count`和候选值`candidate`。-遍历数组,如果`count`为0,设置当前数为候选值。-如果当前数等于候选值,`count`加1;否则减1。-最终`candidate`即为多数元素。3.题目:请用C++实现一个函数,输入一个字符串,返回其中最长的回文子串。示例:输入:`"babad"`→输出:`"bab"`或`"aba"`输入:`"cbbd"`→输出:`"bb"`答案:cppinclude<str
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阿里云招聘面试题及答案
- 孵化工安全技能测试水平考核试卷含答案
- 2026届吉林省长春实验中学高二上生物期末学业质量监测模拟试题含解析
- 风轮叶片制造工创新思维强化考核试卷含答案
- 香料原料处理工风险识别知识考核试卷含答案
- 传声器装调工安全培训效果评优考核试卷含答案
- 我的朋友真有趣作文600字(5篇)
- 航天科工四院十七所2025届校园招聘正式开启笔试参考题库附带答案详解(3卷)
- 2025浙江杭州市钱江合晟控股发展有限公司招聘6人笔试参考题库附带答案详解(3卷)
- 2025广西梧州国家粮食储备库招聘工作人员2人笔试参考题库附带答案详解(3卷)
- 2025年黑龙江省哈尔滨市中考数学真题含解析
- 2026年湖南现代物流职业技术学院单招职业技能考试题库附答案
- 河北省2025年职业院校嵌入式系统应用开发赛项(高职组)技能大赛参考试题库(含答案)
- 2025译林版新教材初中英语八年级上册单词表(复习必背)
- 2025年70岁老年人换新本驾驶证需考三力测试题及答案
- 企业微信基础知识培训
- 《房间空气调节器室内热舒适性评价方法》
- 2025秋期版国开电大本科《管理英语3》一平台综合测试形考任务在线形考试题及答案
- 苏州大学《高等数学A 2》2023 - 2024学年期末试卷
- 电解铝安全环保知识培训课件
- 线性代数期末考试试题及答案
评论
0/150
提交评论