2026年软件开发面试编程题_第1页
2026年软件开发面试编程题_第2页
2026年软件开发面试编程题_第3页
2026年软件开发面试编程题_第4页
2026年软件开发面试编程题_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

2026年软件开发面试编程题一、算法与数据结构(共3题,每题20分,总分60分)1.题目:给定一个非空整数数组,返回所有和为给定目标值的三元组。例如,给定数组`nums=[-1,0,1,2,-1,-4]`,目标值`target=0`,则所有和为0的三元组为`[[-1,-1,2],[-1,0,1]]`。请实现该算法,要求时间复杂度不高于O(n²)。答案:pythondefthree_sum(nums,target):nums.sort()n=len(nums)res=[]foriinrange(n):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==target:res.append([nums[i],nums[left],nums[right]])whileleft<rightandnums[left]==nums[left+1]:left+=1whileleft<rightandnums[right]==nums[right-1]:right-=1left+=1right-=1eliftotal<target:left+=1else:right-=1returnres解析:首先对数组进行排序,排序后可以使用双指针法。对于每个元素`nums[i]`,使用两个指针`left`和`right`分别指向`i+1`和`n-1`,计算三数之和`total`:-如果`total==target`,则记录该三元组,并跳过重复的元素继续查找。-如果`total<target`,则左指针右移以增加总和。-如果`total>target`,则右指针左移以减少总和。排序的时间复杂度为O(nlogn),双指针遍历的时间复杂度为O(n²),总体时间复杂度为O(n²)。2.题目:给定一个包含重复元素的数组,返回该数组所有不重复的全排列。例如,给定`nums=[1,1,2]`,返回`[[1,1,2],[1,2,1],[2,1,1]]`。答案:pythondefpermute_unique(nums):defbacktrack(path,used,res):iflen(path)==len(nums):res.append(path.copy())returnforiinrange(len(nums)):ifused[i]:continueifi>0andnums[i]==nums[i-1]andnotused[i-1]:continueused[i]=Truepath.append(nums[i])backtrack(path,used,res)path.pop()used[i]=Falsenums.sort()res=[]used=[False]len(nums)backtrack([],used,res)returnres解析:首先对数组进行排序,以方便跳过重复的元素。使用回溯法生成所有排列,并使用`used`数组记录每个元素是否已被使用。在递归过程中,如果当前数字与前一个数字相同且前一个数字未被使用,则跳过以避免重复排列。回溯法的时间复杂度较高,但可以确保所有排列的唯一性。3.题目:给定一个二叉树,判断其是否是平衡二叉树。平衡二叉树的定义是:对于任意节点,其左右子树的高度差不超过1。答案:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefis_balanced(root):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]解析:使用后序遍历(左-右-根)递归计算每个节点的高度,并判断左右子树的高度差是否不超过1。如果任意节点不满足平衡条件,则整棵树不是平衡二叉树。时间复杂度为O(n),因为每个节点只被访问一次。二、系统设计(共2题,每题40分,总分80分)1.题目:设计一个简单的微博系统,要求支持以下功能:-用户发布微博(包含文本内容和时间戳)。-用户关注其他用户。-用户查看自己关注用户的最新微博。-系统需要支持高并发访问。要求:-描述系统的整体架构。-说明关键技术选型(数据库、缓存、消息队列等)。-分析系统的性能瓶颈及解决方案。答案:整体架构:系统采用微服务架构,主要分为以下几个模块:1.用户服务(UserService):管理用户信息、关注关系。2.微博服务(TweetService):处理微博发布、查询、存储。3.消息队列(MQ):异步处理微博发布、关注更新等操作。4.缓存服务(Redis):缓存热点数据(如用户最新微博、关注列表)。5.数据库(MySQL/PostgreSQL):持久化用户信息、微博数据、关注关系。关键技术选型:-数据库:使用MySQL分库分表,按用户ID分表以分散读写压力。微博表使用InnoDB引擎,支持事务和索引。-缓存:使用Redis缓存用户关注列表和最新100条微博,设置过期时间。-消息队列:使用Kafka/RabbitMQ处理异步操作,如关注关系变更、微博增量推送。-API网关:使用Nginx/Zuul负载均衡,防DDoS攻击。-缓存穿透:使用布隆过滤器拦截不存在的用户请求。性能瓶颈及解决方案:-微博查询热点:使用Redis缓存热点用户微博,避免数据库压力。-关注关系变更:使用消息队列异步更新关注列表,避免同步阻塞。-写入瓶颈:微博表使用分片,按时间或用户ID分表;使用写入队列缓冲写入请求。2.题目:设计一个短链接系统,要求:-输入长链接,生成短链接,支持自定义短域名。-支持短链接跳转回长链接。-高并发下保证短链接唯一性和快速跳转。要求:-描述短链接生成算法。-说明系统架构及数据存储方案。-分析高并发场景下的优化措施。答案:短链接生成算法:使用Base62编码,将长链接的SHA-256哈希值转换为6位短码:1.对长链接进行SHA-256哈希,得到64位二进制串。2.压缩为20位二进制(去除前导0)。3.转换为Base62(0-9,a-z,A-Z),得到6位短码。例如:`/long-url`→`/a1b2c3`。系统架构及数据存储:-API服务(Nginx+Node.js/Go):处理短链接生成和跳转请求。-缓存(Redis):缓存短码到长链接的映射,减少数据库查询。-数据库(MySQL):存储短码、长链接、创建时间、点击量等。-分布式锁(RedisLock):保证短码生成唯一性。高并发优化措施:-缓存预热:上线前预缓存热门短链接。-异步写入:使用消息队列缓冲创建请求,批量写入数据库。-CDN缓存:将短链接跳转页面缓存到CDN,加速响应。-限流:API网关限流,防止恶意请求。三、数据库与存储(共2题,每题20分,总分40分)1.题目:设计一个电商订单表,包含以下字段:-订单ID(主键)、用户ID、商品ID、数量、价格、下单时间、支付状态、物流状态。-要求:-支持按用户ID和支付状态查询未发货订单。-支持按商品ID和下单时间范围查询订单。-分析索引设计及查询优化方案。答案:表结构:sqlCREATETABLEorders(order_idBIGINTPRIMARYKEYAUTO_INCREMENT,user_idBIGINTNOTNULL,product_idBIGINTNOTNULL,quantityINTNOTNULL,priceDECIMAL(10,2)NOTNULL,order_timeDATETIMENOTNULL,payment_statusVARCHAR(20)NOTNULL,logistics_statusVARCHAR(20)NOTNULL,INDEXidx_user_payment(user_id,payment_status),INDEXidx_product_time(product_id,order_time));索引设计:-`idx_user_payment`:联合索引,按`user_id`和`payment_status`查询未发货订单(假设未发货状态为`'UNSHIPPED'`)。-`idx_product_time`:联合索引,按`product_id`和`order_time`查询商品订单。查询优化:-未发货订单查询:sqlSELECTFROMordersWHEREuser_id=?ANDpayment_status='UNSHIPPED';利用`idx_user_payment`快速过滤。-商品订单查询:sqlSELECTFROMordersWHEREproduct_id=?ANDorder_timeBETWEEN?AND?;利用`idx_product_time`范围扫描。2.题目:假设使用Redis缓存热点数据,当缓存过期后,如何保证数据库与缓存的数据一致性?答案:一致性方案:1.缓存穿透:使用布隆过滤器拦截不存在的请求,避免查询数据库。2.缓存击穿:热点数据使用永不过期缓存,或设置长TTL(如1小时)。3.缓存雪崩:使用随机过期时间,避免大量缓存同时过期。4.写入时同步更新:-数据库写入后更新缓存:写入数据库成功后,使用Lua脚本原子性更新缓存。-消息队列异步更新:写入数据库后,发送消息到Kafka/RabbitMQ,消费者更新缓存。5.双删策略:-先删除缓存,延时后再次删除缓存,防止读请求先命中旧缓存。四、网络与安全(共1题,20分)1.题目:解释HTTP缓存机制,包括强缓存和协商缓存的工作原理及优缺点。答案:强缓存:-原理:通过`Cache-Control:max-age`或`Expires`头部控制,缓存直接使用本地副本,无需请求服务器。-优点:减少服务器负载和响应时间。-缺点:数据可能过期,需要协商缓存校验。协商缓存:-原理:使用`Last-Modified`/`ETag`头部与服务器校验:-若本地缓存未过期,发送`If-None-Match`/`If-Modified-Since`请求,服务器返回304NotModified。-若缓存过期或未命中,服务器返回200及新内容。-优点:保证数据一致性。-缺点:增加一次网络请求。优缺点对比:|方式|强缓存|协商缓存

温馨提示

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

评论

0/150

提交评论