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

下载本文档

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

文档简介

2026年华为软件开发面试题及答案一、编程题(共5题,每题20分,总计100分)1.题目(20分):编写一个函数,输入一个字符串,返回该字符串中所有唯一字符的列表(不区分大小写)。例如,输入`"HelloWorld"`,输出`[['H','e','W','r','d']]`。要求时间复杂度O(n)。答案:pythondefunique_chars(s:str):s_lower=s.lower()freq={}forcharins_lower:freq[char]=freq.get(char,0)+1unique=[charforcharins_loweriffreq[char]==1]return[set(unique)]示例print(unique_chars("HelloWorld"))#输出:[{'h','e','w','r','d'}]解析:-首先将字符串转为小写统一处理,避免大小写重复统计。-使用字典统计每个字符的频率。-遍历字符串,筛选频率为1的字符,用集合去重后返回列表。-时间复杂度为O(n),空间复杂度为O(n)。2.题目(20分):实现一个LRU(LeastRecentlyUsed)缓存,支持`get`和`put`操作。缓存容量为`capacity`,当访问或插入导致缓存超出容量时,需要删除最久未使用的项。要求时间复杂度O(1)。答案:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.order=[]defget(self,key:int)->int:ifkeyinself.cache:self.order.remove(key)self.order.append(key)returnself.cache[key]return-1defput(self,key:int,value:int)->None:ifkeyinself.cache:self.order.remove(key)eliflen(self.cache)>=self.capacity:oldest=self.order.pop(0)delself.cache[oldest]self.cache[key]=valueself.order.append(key)示例cache=LRUCache(2)cache.put(1,1)cache.put(2,2)print(cache.get(1))#返回1cache.put(3,3)#去除键2print(cache.get(2))#返回-1解析:-使用字典`cache`存储键值对,列表`order`记录访问顺序。-`get`操作时,将访问的键移到列表末尾。-`put`操作时,若键已存在则更新并移动到末尾;若超出容量则删除最左侧(最久未使用)的键。-时间复杂度为O(1)。3.题目(20分):给定一个二叉树,判断其是否为平衡二叉树(任意节点的左右子树高度差不超过1)。要求时间复杂度O(n)。答案:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefis_balanced(root:TreeNode)->bool:defcheck(node):ifnotnode:return0,Trueleft_height,left_balanced=check(node.left)right_height,right_balanced=check(node.right)returnmax(left_height,right_height)+1,left_balancedandright_balancedandabs(left_height-right_height)<=1returncheck(root)[1]示例root=TreeNode(3)root.left=TreeNode(9)root.right=TreeNode(20)root.right.left=TreeNode(15)root.right.right=TreeNode(7)print(is_balanced(root))#输出:True解析:-采用后序遍历(左-右-根)递归检查每个节点的高度和平衡性。-若左右子树高度差超过1或子树不平衡,则整棵树不平衡。-时间复杂度为O(n),空间复杂度为O(h)(h为树的高度)。4.题目(20分):编写一个函数,输入一个正整数`n`,返回所有可能的二进制字符串(长度为`n`,且不含连续的`1`)。要求不重复且按字典序排列。答案:pythondefbinary_strings(n:int):result=[]defbacktrack(current):iflen(current)==n:result.append(current)returnifnotcurrentorcurrent[-1]=='0':backtrack(current+'0')ifnotcurrentorcurrent[-1]=='1':backtrack(current+'1')backtrack('')returnresult示例print(binary_strings(3))#输出:['000','001','010','100']解析:-采用回溯法生成所有可能的二进制字符串。-每次添加`'0'`或`'1'`时,确保前一个字符不为`'1'`(避免连续`'1'`)。-时间复杂度为O(2^n),空间复杂度为O(n)。5.题目(20分):实现一个简单的文件压缩算法,输入原始文本,输出对应的压缩结果(使用字典编码,如`"aabcccccaaa"`可压缩为`"a2b1c5a3"`)。要求支持解压缩。答案:pythondefcompress(s:str)->str:ifnots:return""d={}idx=0result=[]current=s[0]count=1forcharins[1:]:ifchar==current:count+=1else:d[idx]=current+str(count)idx+=1current=charcount=1d[idx]=current+str(count)forcharins:result.append(d[idx]foridxins.split(char))return''.join(result)defdecompress(s:str)->str:d={}current=[]fori,charinenumerate(s):ifchar.isdigit():current.append(char)else:ifcurrent:d[''.join(current)]=charcurrent=[]result=[]forcharins:ifchar.isdigit():result.append(d[''.join(result[-len(current):])]int(char))else:result.append(char)return''.join(result)示例original="aabcccccaaa"compressed=compress(original)decompressed=decompress(compressed)print(compressed,decompressed)#输出:a2b1c5a3aabcccccaaa解析:-压缩时,使用字典记录每个字符及其出现次数。-解压缩时,根据字典还原原始字符串。-时间复杂度为O(n),空间复杂度为O(n)。二、系统设计题(共3题,每题30分,总计90分)1.题目(30分):设计一个高并发的短链接生成系统,要求:-支持分布式部署。-链接生成速度快,且短。-可快速解析短链接回原始长链接。-需考虑高可用和容错性。答案:方案:1.分布式部署:-使用Redis作为分布式锁或缓存,保证全局唯一性。-使用ZK或Etcd进行分布式配置管理。2.短链接生成:-使用Base62编码(a-z,A-Z,0-9),将ID转为短字符串。-ID可使用Snowflake算法生成(时间戳+机器ID+序列号)。3.解析:-短链接请求时,解码Base62获取ID,查询数据库或缓存获取原始链接。4.高可用:-使用多副本数据库(如MySQLCluster或MongoDB)。-配置负载均衡(如Nginx或HAProxy)。5.容错性:-使用熔断器(如Hystrix)防止雪崩。-定期备份短链接映射关系。解析:-Base62:将ID转为短字符串,减少存储空间。-Snowflake:生成全局唯一ID,避免冲突。-分布式锁/缓存:保证并发下唯一性。-负载均衡:提高系统吞吐量。2.题目(30分):设计一个实时消息推送系统(如微信、抖音),要求:-支持海量用户(百万级)。-消息可自定义路由(按用户标签、地理位置等)。-支持离线消息存储和重试。-需考虑消息的可靠性和顺序性。答案:方案:1.架构:-消息队列(Kafka/RabbitMQ):异步发送消息,解耦服务。-缓存(Redis):存储在线用户和标签。-数据库(MySQL/Mongo):存储离线消息和用户属性。2.路由:-用户标签使用哈希分区,快速定位目标用户。-地理位置使用Grid分区。3.离线消息:-消息发送失败时,存入数据库,定时重试。-用户上线时,从数据库拉取离线消息。4.可靠性与顺序性:-消息队列保证顺序性(如单线程处理)。-使用幂等性设计防止重复消费。解析:-消息队列:异步处理,提高吞吐量。-哈希分区:快速路由消息。-幂等性:防止重复消费导致问题。3.题目(30分):设计一个高并发的秒杀系统,要求:-支持秒杀商品秒杀量百万级。-防止超卖和秒杀作弊(如机器人)。-需考虑高可用和秒杀后的库存回滚。答案:方案:1.防超卖:-使用分布式锁(Redis或ZK)控制并发库存扣减。-库存扣减和订单生成原子化操作(如MySQL事务)。2.防作弊:-使用验证码或登录态限制请求频率。-限制同一IP或账号的秒杀次数。3.高可用:-使用读写分离(如MySQLCluster)。-负载均衡(如Nginx)分发请求。4.库存回滚:-秒杀失败时,通过事务回滚库存扣减。-使用消息队列补偿未完成的秒杀操作。解析:-分布式锁:保证库存扣减的原子性。-事务:防止超卖。-消息队列:补偿机制。三、数据库题(共2题,每题15分,总计30分)1.题目(15分):设计一张用户表(`users`),包含以下字段:-`id`(主键,自增),-`username`(唯一,不能为空),-`email`(唯一,可为空),-`password`(加密存储),-`created_at`(创建时间,默认当前时间),-`last_login`(上次登录时间,可为空)。要求:-索引哪些字段?-如何防止SQL注入?答案:sqlCREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,emailVARCHAR(100)UNIQUE,passwordVARCHAR(255)NOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,last_loginTIMESTAMPNULL);--索引CREATEINDEXidx_usernameONusers(username);CREATEINDEXidx_emailONusers(email);--防止SQL注入:使用预编译语句(如JDBC或ORM)--示例(JavaJDBC)PreparedStatementstmt=connection.prepareStatement("INSERTINTOusers(username,password)VALUES(?,?)");stmt.setString(1,"user1");stmt.setString(2,hashPassword("password"));stmt.executeUpdate();解析:-`username`和`email`需要唯一索引,提高查询效率。-`password`应加密存储(如bcrypt)。-预编译语句防止SQL注入。2.题目(15分):解释SQL中的`JOIN`语句,并说明`INNERJOIN`和`LEFTJOIN`的区别。答案:JOIN语句:用于关联多个表的数据。INNERJOIN:仅返回两个表中匹配的行。LEFTJOIN:返回左表所有行,右表匹配则返回匹配行,否则为NULL。示例:sql--INNERJOINSELECTusers.username,orders.order_idFROMusersINNERJOINordersONusers.id=orders.user_id;--LEFTJOINSELECTusers.userna

温馨提示

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

最新文档

评论

0/150

提交评论