版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年软件工程师岗位面试题目及答案一、编程题(共5题,每题10分,总分50分)1.题目(10分):编写一个函数,实现将一个字符串中的所有空格替换为"%20"。假设字符串的长度足够容纳替换后的结果。答案:pythondefreplace_spaces(s:str)->str:returns.replace("","%20")示例print(replace_spaces("HelloWorld"))#输出:Hello%20World解析:使用Python内置的`replace`方法直接替换空格为"%20"。时间复杂度为O(n),其中n为字符串长度。2.题目(10分):给定一个链表,判断链表中是否存在环。如果存在,返回环的入口节点;否则返回`None`。答案:pythonclassListNode:def__init__(self,x):self.val=xself.next=Nonedefdetect_cycle(head:ListNode)->ListNode:ifnothead:returnNoneslow=headfast=headwhilefastandfast.next:slow=slow.nextfast=fast.next.nextifslow==fast:检测环的入口slow=headwhileslow!=fast:slow=slow.nextfast=fast.nextreturnslowreturnNone解析:使用快慢指针法(Floyd’sTortoiseandHare)。快指针每次走两步,慢指针每次走一步,若存在环,两者必相遇。相遇后,将慢指针移到头节点,再次以相同速度移动,相遇点即为环入口。3.题目(10分):实现一个LRU(最近最少使用)缓存,支持`get`和`put`操作。缓存容量为固定值`capacity`。答案:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.head=ListNode(0)self.tail=ListNode(0)self.head.next=self.tailself.tail.prev=self.headdef_add_node(self,node:ListNode):node.prev=self.headnode.next=self.head.nextself.head.next.prev=nodeself.head.next=nodedef_remove_node(self,node:ListNode):prev_node=node.prevnext_node=node.nextprev_node.next=next_nodenext_node.prev=prev_nodedef_move_to_head(self,node:ListNode):self._remove_node(node)self._add_node(node)def_pop_tail(self)->ListNode:res=self.tail.prevself._remove_node(res)returnresdefget(self,key:int)->int:ifkeynotinself.cache:return-1node=self.cache[key]self._move_to_head(node)returnnode.valdefput(self,key:int,value:int)->None:ifkeyinself.cache:node=self.cache[key]node.val=valueself._move_to_head(node)else:newNode=ListNode(key,value)self.cache[key]=newNodeself._add_node(newNode)iflen(self.cache)>self.capacity:tail=self._pop_tail()delself.cache[tail.key]解析:使用双向链表+哈希表实现。链表维护访问顺序,哈希表实现O(1)时间复杂度的get和put。4.题目(10分):给定一个非空数组,返回所有可能的子集(无重复元素)。答案:pythondefsubsets(nums:list)->list:res=[]subset=[]defbacktrack(start):res.append(subset.copy())foriinrange(start,len(nums)):subset.append(nums[i])backtrack(i+1)subset.pop()backtrack(0)returnres示例print(subsets([1,2,3]))输出:[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]解析:回溯算法枚举所有子集。通过`start`参数避免重复选择元素,保证子集不重复。5.题目(10分):实现一个二叉树的前序遍历(根-左-右)。答案:pythonclassTreeNode:def__init__(self,x):self.val=xself.left=Noneself.right=Nonedefpreorder_traversal(root:TreeNode)->list:ifnotroot:return[]stack,res=[root],[]whilestack:node=stack.pop()res.append(node.val)ifnode.right:stack.append(node.right)ifnode.left:stack.append(node.left)returnres示例构建二叉树:[1,2,3]1/\23root=TreeNode(1)root.left=TreeNode(2)root.right=TreeNode(3)print(preorder_traversal(root))#输出:[1,2,3]解析:使用栈实现非递归前序遍历。先访问节点,然后右子节点入栈,左子节点入栈,确保左节点先处理。二、算法题(共5题,每题10分,总分50分)1.题目(10分):给定一个排序数组,在原地删除重复出现的元素,返回新数组的长度。答案:pythondefremove_duplicates(nums:list)->int:ifnotnums:return0slow=0forfastinrange(1,len(nums)):ifnums[fast]!=nums[slow]:slow+=1nums[slow]=nums[fast]returnslow+1示例nums=[1,1,2,2,3]print(remove_duplicates(nums))#输出:3,nums前三个元素为[1,2,3]解析:双指针法。`slow`指向当前不重复元素的位置,`fast`遍历数组。若`nums[fast]`不等于`nums[slow]`,则将`nums[fast]`赋值给`nums[slow+1]`,并移动`slow`。2.题目(10分):给定一个包含非负整数的数组,返回其中连续数字的最大和。答案:pythondefmax_subarray(nums:list)->int:ifnotnums:return0max_sum=current_sum=nums[0]fornuminnums[1:]:current_sum=max(num,current_sum+num)max_sum=max(max_sum,current_sum)returnmax_sum示例print(max_subarray([-2,1,-3,4,-1,2,1,-5,4]))#输出:6([4,-1,2,1])解析:动态规划。`current_sum`记录以当前数字结尾的最大和,`max_sum`记录全局最大和。若`current_sum`为负,则重置为0。3.题目(10分):给定一个字符串`s`,判断它是否是回文串。答案:pythondefis_palindrome(s:str)->bool:s=''.join(c.lower()forcinsifc.isalnum())left,right=0,len(s)-1whileleft<right:ifs[left]!=s[right]:returnFalseleft+=1right-=1returnTrue示例print(is_palindrome("Aman,aplan,acanal:Panama"))#输出:True解析:双指针法。忽略非字母数字字符,忽略大小写,从两端向中间比较。4.题目(10分):给定一个无重复元素的数组`nums`和一个目标值`target`,返回所有相加等于`target`的`nums[i]+nums[j]+nums[k]`组合。答案:pythondefthree_sum(nums:list,target:int)->list:nums.sort()res=[]n=len(nums)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示例print(three_sum([-1,0,1,2,-1,-4],0))输出:[[-1,-1,2],[-1,0,1]]解析:排序后固定一个数,双指针遍历剩余部分。跳过重复元素避免重复组合。5.题目(10分):给定一个整数`n`,返回第`n`个丑数(丑数为正整数,且只包含质因数2、3、5)。答案:pythondefnth_ugly_number(n:int)->int:ugly=[0]nugly[0]=1i2=i3=i5=0next2,next3,next5=2,3,5foriinrange(1,n):ugly[i]=min(next2,next3,next5)ifugly[i]==next2:i2+=1next2=ugly[i2]2ifugly[i]==next3:i3+=1next3=ugly[i3]3ifugly[i]==next5:i5+=1next5=ugly[i5]5returnugly[-1]示例print(nth_ugly_number(10))#输出:12解析:动态规划。维护三个指针`i2`、`i3`、`i5`分别指向下一个丑数的倍数,取最小值作为当前丑数。三、系统设计题(共3题,每题20分,总分60分)1.题目(20分):设计一个简单的微博系统,支持用户发布、关注、点赞和查看时间线功能。答案:核心模块:1.用户(User):存储用户ID、昵称、关注列表、粉丝列表、关注列表、发帖记录。2.帖子(Post):存储帖子ID、用户ID、内容、时间戳、点赞数、转发数。3.关系(Relation):存储关注关系(用户ID-关注者ID)。4.点赞(Like):存储用户ID-帖子ID。数据库设计(简化):sqlCREATETABLEusers(user_idINTPRIMARYKEY,nicknameVARCHAR(50),followersINT,followeesINT);CREATETABLEposts(post_idINTPRIMARYKEY,user_idINT,contentTEXT,timestampDATETIME,likesINTDEFAULT0,sharesINTDEFAULT0,FOREIGNKEY(user_id)REFERENCESusers(user_id));CREATETABLErelations(user_idINT,followee_idINT,PRIMARYKEY(user_id,followee_id),FOREIGNKEY(user_id)REFERENCESusers(user_id),FOREIGNKEY(followee_id)REFERENCESusers(user_id));CREATETABLElikes(user_idINT,post_idINT,PRIMARYKEY(user_id,post_id),FOREIGNKEY(user_id)REFERENCESusers(user_id),FOREIGNKEY(post_id)REFERENCESposts(post_id));核心逻辑:-发布帖子:用户创建帖子,插入`posts`表。-关注用户:插入`relations`表。-查看时间线:遍历关注用户的最新帖子,按时间降序排序。-点赞:插入`likes`表,更新`posts`的`likes`字段。优化:-使用Redis缓存热点用户的时间线。-分页加载时间线,避免单次查询过多数据。2.题目(20分):设计一个高并发的短链接系统(如tinyURL)。答案:核心模块:1.短链接生成:使用哈希算法(如Base62)将长链接映射为短链接。2.存储:缓存(Redis)+数据库(关系型或NoSQL)。3.解析:根据短链接反查长链接。技术选型:-短链接生成:-使用自增ID+Base62编码(a-z,A-Z,0-9)。-举例:ID12345→"aVz"。-存储:-Redis缓存热点短链接,加速查询。-数据库存储所有短链接及其对应长链接。-解析:-短链接到ID→数据库查询长链接→返回长链接。数据库设计(简化):sqlCREATETABLEshortlinks(short_codeVARCHAR(10)PRIMARYKEY,long_urlTEXT,created_atDATETIME);高并发优化:-分布式锁:生成短链接时使用分布式锁,避免ID冲突。-异步写入:使用消息队列(如Kafka)异步更新数据库和缓存。3.题目(20分):设计一个实时消息推送系统(如微信聊天)。答案:核心模块:1.用户连接管理:WebSocket/长连接(如MQTT)。2.消息队列:Kafka/RabbitMQ,处理高并发消息。3.路由:根据用户ID将消息推送到目标设备。4.离线缓存:Redis,存储离线消息。架构设计:plaintext+-++-++-+|用户设备||消息服务器||数据库/缓存||WebSocket/长连接|-||-|(Redis,MySQL)|+-+|WebSocketAPI|+-+|消息队列(Kafka)|+-+核心逻辑:-连接:用户设备建立WebSocket连接,服务器记录设备ID和用户ID。-消息发送:-客户端发送消息(含目标用户ID)。-服务器将消息存入Kafka,并标记为待发送。-消息推送:-消息队列触发推送任务。-根
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 早期康复护理的患者教育
- 护理团队冲突解决技巧
- 护理专升本寒假班:精神科护理学特色教学
- 部编版小学五年级下册语文口语交际及综合性学习复习文档
- 临时设施工程装配式围挡基础浇筑及立柱安装施工作业指导书
- V型滤池施工监理细则
- 医院病理组织脱水机废液收集容器防泄漏细则
- 梅毒患者用药指导与护理
- 公司规范经营及财务透明承诺书3篇范文
- 公共场所紧急撤离路线规划预案
- CJ 3057-1996家用燃气泄漏报警器
- 基于大数据的临床检验结果分析
- DBJ04T 292-2023 住宅物业服务标准
- 中药天花粉简介
- 2024-2025年全国高中数学联赛试题及解答
- 连续退火铜大拉线机性能参数及操作规范
- DB51∕T 2439-2017 高原光伏发电站防雷技术规范
- DB21-T+4005-2024超大规模超深井智慧矿山建设规范
- 【基于单片机的船舶自动灭火系统的设计(论文)17000字】
- DBJ04∕T 299-2013 发泡水泥保温板外墙外保温工程技术规程
- 完工后做好项目复盘总结
评论
0/150
提交评论