2026年软件工程师面试题集及解析_第1页
2026年软件工程师面试题集及解析_第2页
2026年软件工程师面试题集及解析_第3页
2026年软件工程师面试题集及解析_第4页
2026年软件工程师面试题集及解析_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

2026年软件工程师面试题集及解析一、编程题(共5题,每题10分)1.题目:编写一个函数,实现快速排序算法。输入一个整数数组,返回排序后的数组。要求:-不能使用内置的排序函数。-时间复杂度尽可能低。-提供测试用例(例如:`[3,1,4,1,5,9,2,6]`)。2.题目:实现一个无重复字符的最长子串查找功能。输入一个字符串,返回最长子串的长度。要求:-不能使用额外的数据结构(如哈希表)。-时间复杂度O(n)。-提供测试用例(例如:`"abcabcbb"`)。3.题目:编写一个函数,判断一个二叉树是否为平衡二叉树。平衡二叉树的定义是:左右子树的高度差不超过1。要求:-不能递归计算子树高度。-时间复杂度O(n)。-提供测试用例(例如:`[3,9,20,null,null,15,7]`)。4.题目:实现一个LRU(最近最少使用)缓存。支持`get`和`put`操作。要求:-使用链表和哈希表结合实现。-`get`操作返回值在O(1)时间内完成。-`put`操作在O(1)时间内完成。-提供测试用例(例如:`put(1,1),put(2,2),get(1),put(3,3),get(2)`)。5.题目:编写一个函数,实现二进制字符串的翻转。输入一个二进制字符串,返回翻转后的字符串。要求:-不能使用内置函数。-时间复杂度O(n)。-提供测试用例(例如:`"1101001"`)。二、算法题(共5题,每题10分)1.题目:给定一个链表,判断是否存在循环。如果存在,返回循环的入口节点;否则返回null。要求:-不能使用额外的空间。-时间复杂度O(n)。-提供测试用例(例如:`[3,2,0,-4]`,表示链表3->2->0->-4->2...)。2.题目:实现一个二叉搜索树的中序遍历。要求:-不能递归实现。-使用迭代方法。-提供测试用例(例如:`[1,null,2,3]`,表示二叉树1->null->2->3)。3.题目:编写一个函数,实现字符串的压缩。输入一个字符串,返回压缩后的字符串。要求:-压缩后的字符串长度小于原字符串,则返回原字符串。-提供测试用例(例如:`"aabcccccaaa"`)。4.题目:实现一个动态规划算法,计算斐波那契数列的第n项。要求:-不能使用递归。-时间复杂度O(n)。-提供测试用例(例如:`n=10`)。5.题目:编写一个函数,实现字符串的子串查找。输入两个字符串,返回第一个字符串中第二个字符串的起始索引。要求:-不能使用内置函数。-时间复杂度O(n)。-提供测试用例(例如:`"hello","ll"`)。三、系统设计题(共3题,每题15分)1.题目:设计一个短链接系统。输入一个长链接,返回一个短链接;点击短链接后,重定向到长链接。要求:-短链接长度不超过6位。-支持高并发访问。-提供技术选型和实现思路。2.题目:设计一个微博系统。用户可以发布、评论、点赞。要求:-支持分页加载。-支持实时消息推送。-提供数据库表设计。3.题目:设计一个分布式限流系统。要求:-支持按IP或用户ID限流。-限流策略可以是固定窗口或滑动窗口。-提供技术选型和实现思路。四、数据库题(共3题,每题10分)1.题目:编写SQL查询:表:`orders`(`order_id,customer_id,order_date,status`)查询:返回最近30天已完成的订单数量,按客户ID分组。2.题目:解释SQL优化:SQL:sqlSELECTFROMusersWHEREnameLIKE'%a%'ANDage>20;问题:如何优化这条查询?3.题目:设计数据库表:需求:-用户表(`user_id,username,email,register_date`)-订单表(`order_id,user_id,amount,order_date`)要求:-建立外键约束。-索引哪些字段?五、面试官提问(共5题,每题5分)1.题目:请描述你在项目中遇到的最复杂的Bug,以及如何解决的?2.题目:解释RESTfulAPI的设计原则。3.题目:为什么选择学习软件工程?你的职业规划是什么?4.题目:解释TCP三次握手的过程。5.题目:如何优化一个慢查询?答案及解析一、编程题答案及解析1.快速排序答案:pythondefquick_sort(arr):iflen(arr)<=1:returnarrpivot=arr[len(arr)//2]left=[xforxinarrifx<pivot]middle=[xforxinarrifx==pivot]right=[xforxinarrifx>pivot]returnquick_sort(left)+middle+quick_sort(right)解析:-递归分治思想:选择基准值(pivot),将数组分为小于、等于、大于三部分。-时间复杂度:平均O(nlogn),最坏O(n^2)。-优化:随机选择pivot可降低最坏情况概率。2.最长无重复子串答案:pythondeflength_of_longest_substring(s:str)->int:max_len=0start=0char_set=set()forendinrange(len(s)):whiles[end]inchar_set:char_set.remove(s[start])start+=1char_set.add(s[end])max_len=max(max_len,end-start+1)returnmax_len解析:-滑动窗口思想:使用双指针记录子串范围。-时间复杂度:O(n),每个字符最多访问两次。3.平衡二叉树答案: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]解析:-后序遍历检查子树高度差。-时间复杂度:O(n),每个节点只访问一次。4.LRU缓存答案:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.head=Node(0,0)self.tail=Node(0,0)self.head.next=self.tailself.tail.prev=self.headdefget(self,key:int)->int:ifkeyinself.cache:node=self.cache[key]self._remove(node)self._add(node)returnnode.valuereturn-1defput(self,key:int,value:int)->None:ifkeyinself.cache:self._remove(self.cache[key])node=Node(key,value)self.cache[key]=nodeself._add(node)iflen(self.cache)>self.capacity:lru=self.tail.prevself._remove(lru)delself.cache[lru.key]def_remove(self,node):delself.cache[node.key]node.prev.next=node.nextnode.next.prev=node.prevdef_add(self,node):node.next=self.head.nextnode.next.prev=nodenode.prev=self.headself.head.next=node解析:-使用双向链表和哈希表结合。-`get`操作将节点移动到头部,`put`操作淘汰最久未使用的节点。5.二进制字符串翻转答案:pythondefreverse_binary_string(s:str)->str:returns[::-1]解析:-直接使用切片反转字符串。-时间复杂度:O(n),空间复杂度:O(n)。二、算法题答案及解析1.链表循环检测答案:pythondefdetect_cycle(head):slow=fast=headwhilefastandfast.next:slow=slow.nextfast=fast.next.nextifslow==fast:ptr=headwhileptr!=slow:ptr=ptr.nextslow=slow.nextreturnptrreturnNone解析:-快慢指针法:fast每次走两步,slow每次走一步。-时间复杂度:O(n),空间复杂度:O(1)。2.二叉树中序遍历答案:pythondefinorder_traversal(root):stack,node=[],rootwhilestackornode:whilenode:stack.append(node)node=node.leftnode=stack.pop()yieldnode.valnode=node.right解析:-迭代法:使用栈模拟递归。-时间复杂度:O(n),空间复杂度:O(h)。3.字符串压缩答案:pythondefstring_compression(s:str)->str:ifnots:return""compressed=[]count=1foriinrange(1,len(s)):ifs[i]==s[i-1]:count+=1else:compressed.append(s[i-1]+str(count))count=1compressed.append(s[-1]+str(count))return''.join(compressed)iflen(compressed)<len(s)elses解析:-遍历字符串统计连续字符数量。-时间复杂度:O(n),空间复杂度:O(n)。4.斐波那契数列答案:pythondeffib(n:int)->int:a,b=0,1for_inrange(n):a,b=b,a+breturna解析:-动态规划:使用两个变量存储前两个数。-时间复杂度:O(n),空间复杂度:O(1)。5.字符串子串查找答案:pythondefsubstring_search(s:str,sub:str)->int:ifnotsub:return0foriinrange(len(s)-len(sub)+1):ifs[i:i+len(sub)]==sub:returnireturn-1解析:-暴力匹配:遍历所有可能的起始位置。-时间复杂度:O(nm)。三、系统设计题答案及解析1.短链接系统答案:-技术选型:-哈希函数:`hash(s)=md5(s)%1e6`,转换为6位数字。-数据存储:Redis(内存缓存)+MySQL(持久化)。-实现思路:1.输入长链接,生成唯一ID(如UUID)。2.计算ID的哈希值,转换为短链接(如`/a1b2c3`)。3.缓存短链接->长链接映射关系。4.重定向时查询映射关系。解析:-高并发处理:Redis缓存热点数据。-哈希冲突:可使用随机前缀或分布式哈希。2.微博系统答案:-数据库表设计:sql--用户表CREATETABLEusers(user_idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50),emailVARCHAR(100),created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);--微博表CREATETABLEposts(post_idINTAUTO_INCREMENTPRIMARYKEY,user_idINT,contentTEXT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(user_id)REFERENCESusers(user_id));--评论表CREATETABLEcomments(comment_idINTAUTO_INCREMENTPRIMARYKEY,post_idINT,user_idINT,contentTEXT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(post_id)REFERENCESposts(post_id),FOREIGNKEY(user_id)REFERENCESusers(user_id));-技术选型:-后端:SpringBoot+MySQL。-实时消息:WebSocket(如RedisPub/Sub)。解析:-分页加载:使用MySQL的`LIMIT`和`OFFSET`。-实时消息:Redis可做消息代理。3.分布式限流系统答案:-技术选型:-窗口:RedisLua脚本实现滑动窗口。-存储:RedisHash表(`user_id:counter`)。-实现思路:1.每次请求时,更新Redis中的计数器。2.使用Lua脚本判断当前窗口内的请求是否超标。3.超标则拒绝请求,否则允许。解析:-滑动窗口优于固定窗口,可动态调整。-Redis原子操作保证并发安全。四、数据库题答案及解析1.SQL查询答案:sqlSELECTcustomer_id,COUNT()AScompleted_ordersFROMordersWHEREstatus='completed'ANDorder_date>=DATE_SUB(CURDATE(),INTERVAL30DAY)GROUPBYcustomer_id;解析:-`DATE_SUB`计算最近30天日期。-`GROUPBY`按客户ID分组统计。2.SQL优化优化方法:1.添加索引:`CREATEINDEXidx_name_ageONusers(name,age);`2.避免模糊查询:使用`COLLATE`指定字符集。3.分解查询:先筛选`age>20`,再模糊匹配。解析:-索引可加速范围查询和排序。-模糊查询全表扫描,性能较差。3.数据库表设计答案:sql--用户表CREATETABLEusers(user_idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)UNIQUE,emailVARCHAR(100)UNIQUE,register_dateTIMESTAMPDEFAULTCURRENT_TIMESTAMP);--订单表CREATETABLEorders(order_idINTAUTO_INCREMENTPRIMARYKEY,user_idINT,amountDECIMAL(10,2),order_dateTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKE

温馨提示

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

评论

0/150

提交评论