版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年软件开发工程师面试题库及编程练习含答案一、编程基础(5题,每题10分)1.题目(10分):编写一个函数,接收一个正整数`n`,返回一个列表,其中包含从`1`到`n`的所有奇数。要求不使用任何内置函数,仅用Python实现即可。答案:pythondefodd_numbers(n):result=[]foriinrange(1,n+1):ifi%2!=0:result.append(i)returnresult示例调用print(odd_numbers(10))#输出:[1,3,5,7,9]解析:通过循环从`1`到`n`遍历每个数字,使用`%`判断是否为奇数,如果不是`0`则加入结果列表。这种方法简单直观,适合初学者。2.题目(10分):实现一个简单的字符串反转函数,输入一个字符串`s`,返回其反转后的结果。不使用Python的`reverse()`或切片方法。答案:pythondefreverse_string(s):result=[]forcharins:result.insert(0,char)return''.join(result)示例调用print(reverse_string("hello"))#输出:"olleh"解析:通过遍历字符串的每个字符,并使用`insert(0,char)`将其插入到结果列表的开头,实现反转效果。时间复杂度为O(n²),适合理解基本操作。3.题目(10分):编写一个函数,接收一个列表`nums`,返回列表中所有元素的和。要求在计算过程中去除所有负数。答案:pythondefsum_positive(nums):total=0fornuminnums:ifnum>=0:total+=numreturntotal示例调用print(sum_positive([1,-2,3,-4,5]))#输出:9解析:遍历列表,仅对非负数进行累加。这种方法高效且易于理解,适合处理简单的列表操作。4.题目(10分):实现一个函数,接收一个字符串`s`,检查其是否为回文(即正读和反读相同)。不使用任何内置函数。答案:pythondefis_palindrome(s):left,right=0,len(s)-1whileleft<right:ifs[left]!=s[right]:returnFalseleft+=1right-=1returnTrue示例调用print(is_palindrome("level"))#输出:Trueprint(is_palindrome("hello"))#输出:False解析:使用双指针法,从字符串的两端向中间移动,比较对应位置的字符是否相同。如果发现不匹配则立即返回`False`,否则最终返回`True`。5.题目(10分):编写一个函数,接收两个字符串`s1`和`s2`,返回它们的最长公共子串。例如,`s1="abcde"`,`s2="ace"`,返回`"ace"`。答案:pythondeflongest_common_substring(s1,s2):m,n=len(s1),len(s2)dp=[[0](n+1)for_inrange(m+1)]max_len=0end=0foriinrange(1,m+1):forjinrange(1,n+1):ifs1[i-1]==s2[j-1]:dp[i][j]=dp[i-1][j-1]+1ifdp[i][j]>max_len:max_len=dp[i][j]end=ielse:dp[i][j]=0returns1[end-max_len:end]示例调用print(longest_common_substring("abcde","ace"))#输出:"ace"解析:使用动态规划(DP)方法,构建一个二维DP表,其中`dp[i][j]`表示`s1`的前`i`个字符和`s2`的前`j`个字符的最长公共子串长度。通过遍历DP表记录最大值及其结束位置,最终提取最长子串。二、算法与数据结构(5题,每题15分)6.题目(15分):给定一个无重复元素的数组`nums`和一个目标值`target`,编写一个函数返回`target`在数组中的索引。要求时间复杂度为O(logn)。答案:pythondefbinary_search(nums,target):left,right=0,len(nums)-1whileleft<=right:mid=(left+right)//2ifnums[mid]==target:returnmidelifnums[mid]<target:left=mid+1else:right=mid-1return-1示例调用print(binary_search([1,2,3,4,5],3))#输出:2解析:二分查找的核心是每次将搜索范围缩小一半,通过比较中间值与目标值确定搜索方向。时间复杂度为O(logn),适合有序数组。7.题目(15分):实现一个LRU(最近最少使用)缓存,支持`get`和`put`操作。使用哈希表和双向链表结合的方式实现。答案:pythonclassListNode: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=ListNode(),ListNode()self.head.next=self.tailself.tail.prev=self.headdefget(self,key:int)->int:ifkeyinself.cache:node=self.cache[key]self._move_to_front(node)returnnode.valuereturn-1defput(self,key:int,value:int)->None:ifkeyinself.cache:node=self.cache[key]node.value=valueself._move_to_front(node)else:node=ListNode(key,value)self.cache[key]=nodeself._add_node(node)iflen(self.cache)>self.capacity:node=self._remove_last_node()delself.cache[node.key]def_move_to_front(self,node):self._remove_node(node)self._add_node(node)def_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_remove_last_node(self):last=self.tail.prevself._remove_node(last)returnlast示例调用cache=LRUCache(2)cache.put(1,1)cache.put(2,2)print(cache.get(1))#返回1cache.put(3,3)#去除键2print(cache.get(2))#返回-1(未找到)解析:LRU缓存通过双向链表维护访问顺序,哈希表存储键值对以实现O(1)时间复杂度。`get`操作将节点移动到链表头部,`put`操作插入新节点并移除最久未使用的节点。8.题目(15分):编写一个函数,接收一个二叉树的根节点,返回其层序遍历结果(即按深度从上到下,同一深度的节点从左到右)。不使用递归。答案:pythonfromcollectionsimportdequeclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdeflevel_order(root):ifnotroot:return[]result=[]queue=deque([root])whilequeue:level_size=len(queue)current_level=[]for_inrange(level_size):node=queue.popleft()current_level.append(node.val)ifnode.left:queue.append(node.left)ifnode.right:queue.append(node.right)result.append(current_level)returnresult示例调用root=TreeNode(3)root.left=TreeNode(9)root.right=TreeNode(20)root.right.left=TreeNode(15)root.right.right=TreeNode(7)print(level_order(root))#输出:[[3],[9,20],[15,7]]解析:使用队列实现层序遍历,每次处理当前层的所有节点,并将其子节点加入队列。通过记录每一层的节点数量,确保按深度顺序遍历。9.题目(15分):实现一个函数,判断一个字符串是否是有效的括号组合。例如,`"()"`和`"{[]}"`是有效的,`"([)]"`是无效的。答案:pythondefisValid(s:str)->bool:stack=[]mapping={')':'(','}':'{',']':'['}forcharins:ifcharinmapping:top_element=stack.pop()ifstackelse'#'ifmapping[char]!=top_element:returnFalseelse:stack.append(char)returnnotstack示例调用print(isValid("()"))#输出:Trueprint(isValid("{[]}"))#输出:Trueprint(isValid("([)]"))#输出:False解析:使用栈来匹配括号,遍历字符串时,对于闭括号检查栈顶是否为对应的开括号。如果匹配则弹出栈顶,否则返回无效。最后栈应为空表示完全匹配。10.题目(15分):给定一个字符串`s`,找到其中最长的回文子串。例如,`"babad"`的最长回文子串是`"bab"`或`"aba"`。答案:pythondeflongest_palindrome(s:str)->str:ifnots:return""start,end=0,0foriinrange(len(s)):len1=self._expand_around_center(s,i,i)len2=self._expand_around_center(s,i,i+1)max_len=max(len1,len2)ifmax_len>end-start:start=i-(max_len-1)//2end=i+max_len//2returns[start:end+1]def_expand_around_center(self,s,left,right):whileleft>=0andright<len(s)ands[left]==s[right]:left-=1right+=1returnright-left-1示例调用print(longest_palindrome("babad"))#输出:"bab"或"aba"解析:通过遍历每个字符,分别以该字符为中心(奇数长度)和该字符与下一个字符为中心(偶数长度)扩展,记录最长回文子串的起始和结束位置。三、系统设计(3题,每题20分)11.题目(20分):设计一个简单的微博系统,需要支持以下功能:1.用户注册和登录;2.发布微博(包含文本和图片);3.刷新微博列表(按时间倒序);4.点赞和评论。要求说明核心数据结构和主要接口设计。答案:核心数据结构:-`User`:用户信息,包含`id`,`username`,`password`,`follows`(关注的用户列表),`followers`(粉丝列表),`tweets`(发布的微博列表)。-`Tweet`:微博信息,包含`id`,`user_id`,`text`,`images`(图片列表),`likes`(点赞数),`comments`(评论列表),`timestamp`(发布时间)。-`Comment`:评论信息,包含`id`,`user_id`,`text`,`tweet_id`,`timestamp`。-`Like`:点赞信息,包含`user_id`,`tweet_id`。主要接口设计:pythonclassUser:def__init__(self,id,username,password):self.id=idself.username=usernameself.password=passwordself.follows=set()self.followers=set()self.tweets=[]defregister(self):注册逻辑(检查用户名唯一性等)deflogin(self,password):登录逻辑(验证密码)defpost_tweet(self,text,images):tweet=Tweet(id,self.id,text,images,[])self.tweets.append(tweet)通知关注者deffollow(self,user):self.follows.add(user)user.followers.add(self)defget_tweets(self):returnsorted(self.tweets,key=lambdax:x.timestamp,reverse=True)classTweet:def__init__(self,id,user_id,text,images,likes):self.id=idself.user_id=user_idself.text=textself.images=imagesself.likes=set()ments=[]self.timestamp=datetime.now()deflike(self,user):self.likes.add(user)defcomment(self,user,text):comment=Comment(id,user.id,text,self.id)ments.append(comment)其他类(Comment,Like)类似实现解析:微博系统需要支持用户管理、内容发布和互动功能。通过合理的数据结构设计(如用户和微博的类),可以方便地实现核心功能。时间倒序可以通过在`User`类中维护按时间排序的`tweets`列表实现。12.题目(20分):设计一个短链接生成系统,要求:1.输入长链接,生成短链接;2.短链接唯一且可快速解析回原链接;3.支持高并发访问。要求说明技术选型和实现方案。答案:技术选型:-使用Base62编码(包含字母和数字)将长链接转换为短链接;-使用哈希表(如Redis)存储短链接与长链接的映射;-使用分布式缓存和负载均衡(如Nginx)支持高并发。实现方案:1.短链接生成:-对长链接进行MD5哈希,取哈希的前8位作为唯一标识;-使用Base62编码将标识转换为短链接(如`/a1b2c3`)。2.存储映射:-使用Redis存储短链接与长链接的映射,`key`为短链接,`value`为长链接。3.解析回原链接:-接收短链接,从Redis获取对应的长链接并返回。4.高并发支持:-使用Nginx负载均衡,Redis集群分片,确保系统稳定。示例代码(伪代码):pythondefgenerate_short_link(long_url):hash_id=hashlib.md5(long_url.encode()).hexdigest()[:8]short_code=base62_encode(int(hash_id,16))short_link=f"/{short_code}"redis.set(short_link,long_url)returnshort_linkdefresolve_short_link(short_link):long_url=redis.get(short_link)returnlong_urliflong_urlelse"URLnotfound"解析:短链接系统需要保证唯一性和快速解析,通过哈希和Base62编码实现。Redis用于存储映射关系,Nginx和集群技术确保高并发下的性能和稳定性。13.题目(20分):设计一个消息队列系统,要求:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年云南交通运输职业学院马克思主义基本原理概论期末考试笔试真题汇编
- 2025年西安航空职工大学马克思主义基本原理概论期末考试参考题库
- 共同饮酒产生人身损害责任研究
- 应聘物流消防安全培训课件
- 办公家具定制合同
- 高校毕业生就业服务方案
- 法务咨询服务合同
- 应急管理部推动安全培训课件
- 2026年中心化人力资源服务派遣协议
- 2026年商标品牌授权协议
- 八年级历史上册知识结构复习提纲
- 建筑装饰施工中的安全教育培训考核试卷
- 钬激光在皮肤科手术中的临床应用
- 江苏省淮安市八校联考2025届物理九上期末统考试题含解析
- 2024年四川省内江市中考物理试卷附答案
- 钢铁购销简单合同范本
- TSG特种设备安全技术规范TSGD-202工业管道安全技术规程
- 2024年4月自考00612日本文学选读试题
- 新年团建室内活动策划
- 2023秋季学期国开思政课《思想道德与法治》在线形考(专题检测1-7)试题及答案
- EPC工程总承包项目设计及施工的配合制度
评论
0/150
提交评论