2026年软件工程师专业级面试问题及解答_第1页
2026年软件工程师专业级面试问题及解答_第2页
2026年软件工程师专业级面试问题及解答_第3页
2026年软件工程师专业级面试问题及解答_第4页
2026年软件工程师专业级面试问题及解答_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

2026年软件工程师专业级面试问题及解答一、编程实现题(共3题,每题20分)1.(20分)设计一个高效的任务调度器题目描述:假设你需要设计一个任务调度器,支持动态添加任务、按优先级执行任务(优先级由整数表示,数值越大优先级越高),并确保高优先级任务能够及时抢占低优先级任务的执行。请用Python实现该调度器,支持以下功能:-`add_task(task_id,priority)`:添加任务,`task_id`为任务唯一标识,`priority`为优先级。-`execute()`:执行当前最高优先级任务,并返回任务ID。如果多个任务具有相同最高优先级,则按添加顺序执行。要求:-使用最小堆(优先队列)实现,确保`add_task`和`execute`的时间复杂度分别为O(logn)和O(1)。-提供测试代码,验证功能正确性。答案与解析:pythonimportheapqclassTaskScheduler:def__init__(self):self.tasks=[]#存储任务,格式为(-priority,task_id,index)defadd_task(self,task_id,priority):使用最小堆,优先级高的任务存储为较小的负数heapq.heappush(self.tasks,(-priority,task_id,len(self.tasks)))defexecute(self):ifnotself.tasks:returnNone_,task_id,_=heapq.heappop(self.tasks)returntask_id测试代码scheduler=TaskScheduler()scheduler.add_task("task1",3)scheduler.add_task("task2",5)scheduler.add_task("task3",5)print(scheduler.execute())#输出:task2print(scheduler.execute())#输出:task3print(scheduler.execute())#输出:task1解析:-使用Python的`heapq`模块实现最小堆,将优先级取负数以实现最大堆效果。任务存储为三元组`(-priority,task_id,index)`,确保在优先级相同的情况下按添加顺序执行。-`add_task`时间复杂度为O(logn),`execute`时间复杂度为O(1)。2.(20分)实现LRU缓存题目描述:设计LRU(LeastRecentlyUsed)缓存,支持以下操作:-`get(key)`:返回缓存中键对应的值,如果不存在返回-1。访问键时将其标记为最近使用。-`put(key,value)`:将键值对添加到缓存中,如果缓存已满,则删除最久未使用的键值对。缓存容量固定为`capacity`。要求:-使用哈希表+双向链表实现,确保`get`和`put`的时间复杂度均为O(1)。-提供测试代码。答案与解析:pythonclassDLinkedNode:def__init__(self,key=0,value=0):self.key=keyself.value=valueself.prev=Noneself.next=NoneclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.head,self.tail=DLinkedNode(),DLinkedNode()self.head.next=self.tailself.tail.prev=self.headdef_add_node(self,node):node.prev=self.headnode.next=self.head.nextself.head.next.prev=nodeself.head.next=nodedef_remove_node(self,node):prev_node=node.prevnext_node=node.nextprev_node.next=next_nodenext_node.prev=prev_nodedef_move_to_head(self,node):self._remove_node(node)self._add_node(node)def_pop_tail(self):res=self.tail.prevself._remove_node(res)returnresdefget(self,key:int)->int:node=self.cache.get(key,None)ifnotnode:return-1self._move_to_head(node)returnnode.valuedefput(self,key:int,value:int)->None:node=self.cache.get(key)ifnotnode:newNode=DLinkedNode(key,value)self.cache[key]=newNodeself._add_node(newNode)iflen(self.cache)>self.capacity:tail=self._pop_tail()delself.cache[tail.key]else:node.value=valueself._move_to_head(node)测试代码cache=LRUCache(2)cache.put(1,1)cache.put(2,2)print(cache.get(1))#输出:1cache.put(3,3)#去除键2print(cache.get(2))#输出:-1cache.put(4,4)#去除键1print(cache.get(1))#输出:-1print(cache.get(3))#输出:3print(cache.get(4))#输出:4解析:-使用双向链表维护最近使用顺序,哈希表实现O(1)访问。-`get`时将节点移动到头部,`put`时如果键已存在则更新值并移动到头部,否则新建节点并添加到头部;如果超出容量则删除尾部节点。3.(20分)设计一个简单的数据库事务日志系统题目描述:设计一个数据库事务日志系统,支持以下操作:-`log_action(action,timestamp)`:记录一条事务日志,`action`为操作类型(如"INSERT"、"UPDATE"、"DELETE"),`timestamp`为时间戳。-`replay_logs()`:按时间顺序重放所有日志,并返回操作序列。要求:-日志需要支持高效追加和按时间排序。-提供测试代码。答案与解析:pythonimportbisectclassTransactionLog:def__init__(self):self.logs=[]#存储日志,格式为(timestamp,action)deflog_action(self,action,timestamp):bisect.insort(self.logs,(timestamp,action))defreplay_logs(self):return[actionfor_,actioninself.logs]测试代码log_system=TransactionLog()log_system.log_action("INSERT",20261001)log_system.log_action("UPDATE",20261002)log_system.log_action("DELETE",20261003)print(log_system.replay_logs())#输出:['INSERT','UPDATE','DELETE']解析:-使用`bisect.insort`维护日志按时间戳排序,确保插入时间复杂度为O(logn),重放时间复杂度为O(n)。-日志格式为`(timestamp,action)`,便于按时间顺序重放。二、系统设计题(共2题,每题30分)1.(30分)设计一个高并发的短链接系统题目描述:设计一个短链接系统(如tinyURL),支持以下功能:-用户输入长链接,系统生成一个唯一的短链接。-用户通过短链接访问时,系统返回对应的长链接。-高并发场景下保证链接生成和解析的效率及一致性。要求:-说明核心数据结构和算法。-提出高并发解决方案(如分布式锁、缓存等)。-估算系统容量和性能指标。答案与解析:核心数据结构:-使用哈希表存储短链接与长链接的映射(`short_to_long`)。-使用自增ID或随机算法生成短链接(如62位随机字符串)。高并发解决方案:1.分布式缓存(Redis):缓存热点短链接,减少数据库查询。2.分布式锁(RedisLock):保证短链接生成唯一性。3.异步处理:使用消息队列(如Kafka)处理高并发请求。系统容量和性能指标:-每秒处理请求量:假设使用Redis+数据库组合,可支持每秒10万+请求。-短链接生成:62位随机字符串,理论短链接数量超过10^18。伪代码示例:pythonimportuuidimportredisclassShortLinkSystem:def__init__(self):self.redis=redis.Redis()self.db={}#模拟数据库defgenerate_short_link(self,long_url):short_key=str(uuid.uuid4().int)[:6]#生成62位随机字符串whileshort_keyinself.db:short_key=str(uuid.uuid4().int)[:6]self.db[short_key]=long_urlself.redis.set(short_key,long_url)#缓存returnshort_keydefget_long_link(self,short_key):ifshort_keyinself.redis:returnself.redis.get(short_key)returnself.db.get(short_key,"URLnotfound")解析:-使用UUID生成短链接,确保唯一性。-分布式缓存和锁可显著提升性能和一致性。2.(30分)设计一个实时数据流处理系统题目描述:设计一个实时数据流处理系统,支持以下功能:-接收来自多个源的数据流(如传感器、日志)。-对数据流进行实时聚合(如统计平均值、最大值)。-支持自定义回调函数处理数据。要求:-说明系统架构(消息队列、流处理引擎)。-提出容错和扩展方案。-举例说明如何处理实时聚合。答案与解析:系统架构:1.消息队列(Kafka):存储原始数据流,解耦数据源和处理器。2.流处理引擎(Flink/SparkStreaming):实时聚合和回调处理。3.状态存储(Redis):存储聚合状态(如滑动窗口平均值)。容错和扩展方案:-副本机制:Kafka分区+副本保证数据不丢失。-动态扩展:流处理引擎支持按需增加节点。实时聚合示例(Flink伪代码):javaDataStream<String>sensorData=KafkaUtils.createStream(env,"topic","group",TypeInformation.of(newTypeHint<String>(){}));DataStream<Double>avgTemp=sensorData.map(newMapFunction<String,Double>(){@OverridepublicDoublemap(Stringvalue){returnDouble.parseDouble(value.split(",")[1]);}}).keyBy(0).window(TumblingProcessingTimeWindows.of(Time.minutes(1))).aggregate(newAggregateFunction<Double,Double,Double>(){@OverridepublicDoublecreateAccumulator(){return0.0;}@OverridepublicDoubleadd(Doublevalue,Doubleaccumulator){returnaccumulator+value;}@OverridepublicDoublegetResult(Doubleaccumulator){returnaccumulator/sensorData.getParallelism();}@OverridepublicDoublemerge(Doublea,Doubleb){returna+b;}});avgTemp.addSink(newPrintSinkFunction<Double>());解析:-使用Flink的滑动窗口聚合计算平均值。-Kafka+流处理引擎架构可支持大规模实时数据处理。三、算法与数据结构题(共3题,每题15分)1.(15分)判断二叉树是否是平衡二叉树题目描述:给定一个二叉树,判断其是否是平衡二叉树。平衡二叉树的定义是:对于任意节点,其左右子树的高度差不超过1。要求:-提出时间复杂度为O(n)的解法。-提供Python代码实现。答案与解析:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightclassSolution:defisBalanced(self,root:TreeNode)->bool:defcheck(node):ifnotnode:return0,Trueleft_height,left_balanced=check(node.left)ifnotleft_balanced:return0,Falseright_height,right_balanced=check(node.right)ifnotright_balanced:return0,Falsereturnmax(left_height,right_height)+1,abs(left_height-right_height)<=1_,balanced=check(root)returnbalanced测试代码root=TreeNode(3)root.left=TreeNode(1)root.right=TreeNode(2)root.left.left=TreeNode(0)root.left.right=TreeNode(0)print(Solution().isBalanced(root))#输出:False解析:-递归计算每个节点的高度,同时判断左右子树高度差。-时间复杂度为O(n),空间复杂度为O(h),h为树高度。2.(15分)查找无重复元素排序数组的中位数题目描述:给定一个无重复元素的排序数组,返回中位数。如果数组长度为偶数,返回中间两个数的平均值。要求:-提出时间复杂度为O(logn)的解法。-提供Python代码实现。答案与解析:pythondeffindMedianSortedArrays(nums1,nums2):total=len(nums1)+len(nums2)iftotal%2==1:returnfindKth(nums1,nums2,total//2+1)else:left=findKth(nums1,nums2,total//2)right=findKth(nums1,nums2,total//2+1)return(left+right)/2deffindKth(nums1,nums2,k):ifnotnums1:returnnums2[k-1]ifnotnums2:returnnums1[k-1]ifk==1:returnmin(nums1[0],nums2[0])mid1=min(k//2,len(nums1))-1mid2=min(k//2,len(nums2))-1ifnums1[mid1]>nums2[mid2]:returnfindKth(nums1,nums2[mid2+1:],k-mid2-1)else:returnfindKth(nums1[mid1+1:],nums2,k-mid1-1)测试代码nums1=[1,3,8]nums2=[7,9,10]pr

温馨提示

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

评论

0/150

提交评论