2026年软件工程师面试高频题_第1页
2026年软件工程师面试高频题_第2页
2026年软件工程师面试高频题_第3页
2026年软件工程师面试高频题_第4页
2026年软件工程师面试高频题_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

2026年软件工程师面试高频题一、编程语言与基础算法(共5题,每题10分,总分50分)1.题目:请用Python实现一个函数,输入一个正整数n,返回其二进制表示中1的个数。例如,输入5(二进制为101),返回2。答案与解析:pythondefcount_bits(n):returnbin(n).count('1')示例print(count_bits(5))#输出:2解析:-`bin(n)`将数字转换为二进制字符串(如5转为`'0b101'`)。-`.count('1')`统计字符串中`'1'`的个数。-此方法简洁但需注意字符串前缀`'0b'`。-更高效的位运算解法:pythondefcount_bits_optimized(n):count=0whilen:n&=n-1#清除最低位的1count+=1returncount2.题目:给定一个字符串`s`,请编写函数判断其是否为有效的括号字符串(只包含`'('`和`')'`,且括号匹配)。答案与解析:pythondefis_valid_brackets(s):stack=[]mapping={')':'(','}':'{',']':'['}forcharins:ifcharinmapping:top=stack.pop()ifstackelse'#'ifmapping[char]!=top:returnFalseelse:stack.append(char)returnnotstack示例print(is_valid_brackets("()[]{}"))#输出:Trueprint(is_valid_brackets("(]"))#输出:False解析:-使用栈结构,遍历字符串:-遇到左括号入栈,遇到右括号弹出并匹配。-若栈为空或栈顶不匹配,返回`False`。-最终栈为空则有效。3.题目:请实现一个LRU(最近最少使用)缓存,支持`get`和`put`操作,容量为`capacity`。答案与解析:pythonclassLRUCache:def__init__(self,capacity):self.capacity=capacityself.cache={}self.order=[]defget(self,key):ifkeyinself.cache:self.order.remove(key)self.order.append(key)returnself.cache[key]return-1defput(self,key,value):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)#哈希表{1:1,3:3},弹出2print(cache.get(2))#输出:-1解析:-使用哈希表`cache`存储键值对,`order`记录访问顺序。-`get`操作:若命中,移动到队尾;未命中返回`-1`。-`put`操作:若已存在,更新并移动;若超出容量,删除最久未使用项。4.题目:给定一个未排序的数组`nums`,请实现快速排序算法。答案与解析:pythondefquick_sort(nums):iflen(nums)<=1:returnnumspivot=nums[len(nums)//2]left=[xforxinnumsifx<pivot]middle=[xforxinnumsifx==pivot]right=[xforxinnumsifx>pivot]returnquick_sort(left)+middle+quick_sort(right)示例print(quick_sort([3,6,8,10,1,2,1]))#输出:[1,1,2,3,6,8,10]解析:-选择枢轴(中位数),将数组分为三部分:小于、等于、大于枢轴。-递归对左右部分排序,合并结果。-时间复杂度O(nlogn),空间复杂度O(logn)。5.题目:请实现一个函数,检查链表是否存在环(可使用快慢指针)。答案与解析:pythonclassListNode:def__init__(self,x):self.val=xself.next=Nonedefhas_cycle(head):slow,fast=head,headwhilefastandfast.next:slow=slow.nextfast=fast.next.nextifslow==fast:returnTruereturnFalse示例node1,node2,node3=ListNode(1),ListNode(2),ListNode(3)node1.next=node2node2.next=node3node3.next=node2#形成环print(has_cycle(node1))#输出:True解析:-快慢指针:慢指针每次移动1步,快指针每次移动2步。-若存在环,快指针最终会追上慢指针;否则快指针到链表末尾。二、系统设计(共3题,每题20分,总分60分)1.题目:设计一个高并发的短链接系统,要求:-输入长链接,输出6位短链接(如`/a1b2c3`)。-支持分布式存储和快速跳转。答案与解析:核心方案:1.短链接生成:-使用Base62编码(`a-z`、`A-Z`、`0-9`),将长链接哈希值映射为6位。-哈希算法:SHA256(防冲突)+取前6位字符。2.分布式存储:-使用Redis/LevelDB存储映射关系(键:短链接,值:长链接)。-异步写入,避免请求阻塞。3.快速跳转:-跳转时,先查缓存(Redis);若未命中,查数据库。4.高并发优化:-负载均衡(如Nginx分发请求)。-限流(令牌桶算法)。伪代码示例:pythondefgenerate_short_link(long_url):hash_value=sha256(long_url.encode()).hexdigest()[:6]short_link=f"/{hash_value}"redis.set(short_link,long_url)returnshort_link2.题目:设计一个微博系统的时间线(Feed)功能,要求:-支持关注/取关用户。-时间线包含关注用户的最新动态,按时间倒序。-支持分页加载(每页20条)。答案与解析:核心方案:1.数据存储:-用户表:存储用户信息。-动态表:存储发布内容(主键ID、用户ID、时间戳、内容)。-关注关系表:存储用户ID和关注ID。2.时间线生成:-查询关注用户的动态,按时间降序排序。-优化:使用Redis缓存用户最新动态。3.分页加载:-SQL分页:`LIMIT20OFFSET0`。-缓存未命中时,从数据库加载数据。伪代码示例:sqlSELECTFROMpostsWHEREuser_idIN(SELECTfollowee_idFROMfollowsWHEREfollower_id=?)ORDERBYcreated_atDESCLIMIT20OFFSET?;3.题目:设计一个实时消息推送系统(如微信、钉钉),要求:-支持单聊和群聊。-消息实时到达(WebSocket或长轮询)。-支持离线缓存和消息重连。答案与解析:核心方案:1.消息存储:-使用MQ(如Kafka)异步处理消息。-消息表:存储消息ID、发送者、接收者、时间戳、状态(已发送/已读)。2.实时推送:-WebSocket:客户端保持连接,服务器主动推送。-长轮询:客户端频繁请求服务器。3.离线缓存:-消息未送达时,存入Redis,客户端上线后拉取。4.重连机制:-客户端断线重连时,同步未读消息。伪代码示例:pythonWebSocket消息推送defsend_message(user_id,message):websocket.send(user_id,message)redis.set(f"unread_{user_id}",message)#离线缓存三、数据库与存储(共3题,每题20分,总分60分)1.题目:设计一个电商订单表,要求:-支持按用户ID和订单时间查询。-支持统计用户订单数量。答案与解析:表结构:sqlCREATETABLEorders(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINT,order_timeTIMESTAMP,amountDECIMAL(10,2),statusVARCHAR(20),INDEXidx_user_time(user_id,order_time));查询示例:sql--查询用户最近10个订单SELECTFROMordersWHEREuser_id=?ORDERBYorder_timeDESCLIMIT10;--统计用户订单数量SELECTuser_id,COUNT()ASorder_countFROMordersGROUPBYuser_id;2.题目:解释MySQL中的索引类型(B-Tree、Hash、Full-Text)的适用场景。答案与解析:-B-Tree索引:-适用场景:范围查询(如`order_timeBETWEEN...`)、排序。-优点:支持范围查询,适用于多列组合索引。-Hash索引:-适用场景:精确查询(如`user_id=?`)。-优点:查询效率高,但无法排序或范围查询。-Full-Text索引:-适用场景:全文检索(如搜索引擎)。-优点:支持模糊匹配(`LIKE'%keyword%'`)。3.题目:如何优化一个大数据量(千万级)表的查询性能?答案与解析:1.索引优化:-选择合适的索引列(优先查询频次高的列)。-避免全表扫描(如`SELECT`改为指定列)。2.分库分表:-水平切分(如按用户ID分表)。-垂直切分(如订单表拆分为订单主表+商品表)。3.缓存优化:-Redis缓存热点数据(如用户信息、商品详情)。4.SQL优化:-避免`JOIN`嵌套,使用子查询优化。-使用`EXPLAIN`分析执行计划。四、分布式与中间件(共3题,每题20分,总分60分)1.题目:解释分布式事务的CAP理论,并举例说明如何解决分布式事务问题。答案与解析:CAP理论:-C(一致性):全局数据状态一致。-A(可用性):系统始终响应请求。-P(分区容错性):网络分区下仍能运行。-通常只能同时满足两项(分布式事务优先CA或AP)。解决方案:-2PC(两阶段提交):-主节点发起投票,所有从节点同意后提交。-优点:强一致性,但可用性差。-TCC(Try-Confirm-Cancel):-每个操作都分三阶段,补偿机制保证一致性。2.题目:如何使用Kafka实现消息的可靠传输?答案与解析:1.生产者配置:-`acks=all`:需所有分区副本确认。-`retries=3`:重试机制。2.消费者配置:-`mit=false`:手动

温馨提示

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

评论

0/150

提交评论