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

下载本文档

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

文档简介

2026年软件工程师面试笔试模拟题及答案详解一、编程题(共5题,每题15分,总分75分)1.编程题:字符串反转(15分)题目:编写一个函数,将输入的字符串反转,不使用内置的反转函数。例如,输入`"hello"`,输出`"olleh"`。要求:-时间复杂度O(n)-空间复杂度O(1)示例代码(Python):pythondefreverse_string(s:str)->str:实现代码答案与解析:pythondefreverse_string(s:str)->str:将字符串转换为列表,因为列表可以原地修改chars=list(s)left,right=0,len(chars)-1whileleft<right:交换左右指针对应的字符chars[left],chars[right]=chars[right],chars[left]left+=1right-=1return''.join(chars)解析:-时间复杂度:遍历字符串一次,为O(n)。-空间复杂度:虽然将字符串转换为列表需要O(n)空间,但题目允许不使用内置函数,因此此方法合理。若严格限制空间,可使用双指针原地修改字符串(Python中字符串不可变,需转换为列表)。2.编程题:斐波那契数列(15分)题目:编写一个函数,计算斐波那契数列的第n项(n≥1)。斐波那契数列定义如下:F(1)=1,F(2)=1,F(3)=2,F(4)=3,...,F(n)=F(n-1)+F(n-2)。要求:-动态规划解法(空间复杂度O(n))-优化为空间复杂度O(1)示例代码(Java):javapublicstaticintfibonacci(intn){//实现代码}答案与解析:javapublicstaticintfibonacci(intn){if(n<=1)returnn;inta=0,b=1,c=0;for(inti=2;i<=n;i++){c=a+b;a=b;b=c;}returnc;}解析:-动态规划(O(n)空间):使用数组存储前两项,逐步计算。-优化(O(1)空间):只存储前两个值,避免使用额外空间。3.编程题:二叉树遍历(15分)题目:给定一个二叉树,编写代码实现前序遍历(根-左-右)。不使用递归,使用栈实现。示例代码(C++):cppstructTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};voidpreorderTraversal(TreeNoderoot){//实现代码}答案与解析:cppvoidpreorderTraversal(TreeNoderoot){if(!root)return;std::stack<TreeNode>stack;stack.push(root);while(!stack.empty()){TreeNodenode=stack.top();stack.pop();//访问节点std::cout<<node->val<<'';//先右后左,保证左子树先处理if(node->right)stack.push(node->right);if(node->left)stack.push(node->left);}}解析:-前序遍历顺序为根-左-右,使用栈时先压右子树再压左子树,弹出时先处理左子树。4.编程题:最长有效括号(15分)题目:给定一个字符串,包含`'('`和`')'`,计算最长的有效括号子串的长度。例如,输入`"(()"`,输出`2`(即`"()"`)。要求:-动态规划解法示例代码(JavaScript):javascriptfunctionlongestValidParentheses(s){//实现代码}答案与解析:javascriptfunctionlongestValidParentheses(s){letmaxLen=0;constdp=Array(s.length).fill(0);for(leti=1;i<s.length;i++){if(s[i]===')'){if(s[i-1]==='('){dp[i]=(i>=2?dp[i-2]:0)+2;}elseif(i-dp[i-1]>0&&s[i-dp[i-1]-1]==='('){dp[i]=dp[i-1]+((i-dp[i-1])>=2?dp[i-dp[i-1]-2]:0)+2;}maxLen=Math.max(maxLen,dp[i]);}}returnmaxLen;}解析:-动态规划数组`dp[i]`表示以`i`结尾的最长有效括号长度。-若`s[i]===')'`且`s[i-1]==='('`,则`dp[i]=dp[i-2]+2`。-若`s[i]===')'`且`s[i-1]===')'`,则检查`i-dp[i-1]-1`是否为`'('`,若是则更新。5.编程题:合并区间(15分)题目:给定一个区间列表,合并所有重叠的区间。例如,输入`[[1,3],[2,6],[8,10]]`,输出`[[1,6],[8,10]]`。要求:-先排序再合并示例代码(Python):pythondefmerge_intervals(intervals):实现代码}答案与解析:pythondefmerge_intervals(intervals):ifnotintervals:return[]按区间的起始位置排序intervals.sort(key=lambdax:x[0])merged=[intervals[0]]forcurrentinintervals[1:]:last=merged[-1]ifcurrent[0]<=last[1]:#有重叠last[1]=max(last[1],current[1])else:merged.append(current)returnmerged解析:-先按区间起始位置排序,然后遍历合并:若当前区间与最后一个区间重叠,则扩展最后一个区间的结束位置;否则,添加新区间。二、算法题(共3题,每题10分,总分30分)1.算法题:滑动窗口最大值(10分)题目:给定一个数组和一个窗口大小k,滑动窗口从左到右移动,每次返回窗口中的最大值。例如,输入`[1,3,-1,-3,5,3,6,7]`,k=3,输出`[3,3,5,5,6,7]`。要求:-使用单调队列优化示例代码(Java):javapublicstaticint[]maxSlidingWindow(int[]nums,intk){//实现代码}答案与解析:javapublicstaticint[]maxSlidingWindow(int[]nums,intk){if(nums==null||nums.length==0||k==0)returnnewint[0];intn=nums.length;int[]res=newint[n-k+1];//双向队列,存储元素索引Deque<Integer>deque=newLinkedList<>();for(inti=0;i<n;i++){//移除不在窗口的元素if(!deque.isEmpty()&&deque.peekFirst()<i-k+1){deque.pollFirst();}//移除小于当前元素的元素while(!deque.isEmpty()&&nums[i]>=nums[deque.peekLast()]){deque.pollLast();}deque.offerLast(i);//第k个元素开始记录结果if(i>=k-1){res[i-k+1]=nums[deque.peekFirst()];}}returnres;}解析:-单调队列存储窗口中元素的索引,确保队首始终是最大值。-滑动窗口时,移除不在窗口的元素,并保持队列单调递减。2.算法题:快速排序(10分)题目:实现快速排序算法,选择一个基准元素,将数组分为小于和大于基准的两部分,递归排序。要求:-使用Lomuto分区方案示例代码(C++):cppvoidquickSort(intarr[],intleft,intright){//实现代码}答案与解析:cppvoidquickSort(intarr[],intleft,intright){if(left>=right)return;//选择基准元素intpivot=arr[right];inti=left;for(intj=left;j<right;j++){if(arr[j]<=pivot){std::swap(arr[i],arr[j]);i++;}}std::swap(arr[i],arr[right]);//递归排序左右两部分quickSort(arr,left,i-1);quickSort(arr,i+1,right);}解析:-Lomuto分区:选择`right`作为基准,遍历数组,将小于基准的元素移到左侧。-递归排序基准左侧和右侧的子数组。3.算法题:最小路径和(10分)题目:给定一个三角形,找到从顶部到底部的最小路径和。每一步只能移动到相邻的数上。例如:[[2],[3,4],[6,5,7],[4,1,8,3]]输出`11`(2→3→5→1)。要求:-动态规划解法示例代码(Python):pythondefminimumTotal(triangle):实现代码}答案与解析:pythondefminimumTotal(triangle):ifnottriangle:return0n=len(triangle)dp=[[0](i+1)foriinrange(n)]dp[0][0]=triangle[0][0]foriinrange(1,n):dp[i][0]=dp[i-1][0]+triangle[i][0]dp[i][i]=dp[i-1][i-1]+triangle[i][i]forjinrange(1,i):dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j]returnmin(dp[-1])解析:-从底部向上计算,`dp[i][j]`表示从`(i,j)`到底部的最小路径和。-递推关系:`dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j]`。三、系统设计题(共2题,每题15分,总分30分)1.系统设计题:设计微博系统(15分)题目:设计一个微博系统,支持用户发布、关注、查看时间线等功能。主要功能:-用户注册/登录-发布微博(限制长度,支持@功能)-关注/取消关注-查看时间线(显示关注用户的最新微博)要求:-简述系统架构-关键数据结构和数据库设计答案与解析:系统架构:-前端:Web/App客户端(React/Vue或原生开发)-后端:微服务架构(如用户服务、微博服务、关系服务)-数据库:MySQL/PostgreSQL(用户、微博、关系)-缓存:Redis(缓存热点数据,如时间线)数据结构:-用户表:`id`,`username`,`password_hash`,`follows`(存储关注用户列表)-微博表:`id`,`user_id`,`content`,`timestamp`,`likes`,`retweets`-关系表:`follower_id`,`followee_id`(双向关系)关键设计:-发布微博:短文本存储(如MongoDB),@功能通过解析内容并关联用户表。-时间线:使用RedisPipeline并发获取关注用户微博,按时间排序。2.系统设计题:设计短链接系统(15分)题目:设计一个短链接系统(如TinyURL),用户输入长链接,系统返回短链接,点击短链接可跳转回长链接。要求:-简述系统架构-关键技术(如Base62编码)答案与解析:系统架构:-前端:输入长链接,返回短链接和跳转页面-后端:微服务(生成短链接、解析短链接)-数据库:关系型数据库(`long_url`,`short_url`,`timestamp`)-缓存:Redis(缓存短链接对应长链接,提高查询效率)关键技术:-Base62编码:将长ID编码为短字符串(62进制,如`a-zA-Z0-9`)。-映射关系:-生成唯一ID(如Snowflake算法)-存储`short_url`(如`/abc123`)对应`long_url`流程:1.输入长链接→生成唯一ID→Base62编码→存储`short_url`和`long_url`→返回短链接。2.访问短链接→解码获取ID→查询Redis缓存(命中则返回长链接)或数据库→返回长链接。答案与解析(单独列出)编程题:1.字符串反转:pythondefreverse_string(s:str)->str:chars=list(s)left,right=0,len(chars)-1whileleft<right:chars[left],chars[right]=chars[right],chars[left]left+=1right-=1return''.join(chars)解析:双指针法,时间O(n),空间O(n)(列表存储)。2.斐波那契数列:javapublicstaticintfibonacci(intn){if(n<=1)returnn;inta=0,b=1,c=0;for(inti=2;i<=n;i++){c=a+b;a=b;b=c;}returnc;}解析:动态规划优化空间至O(1),仅存储前两个值。3.二叉树前序遍历:cppvoidpreorderTraversal(TreeNoderoot){std::stack<TreeNode>stack;stack.push(root);while(!stack.empty()){TreeNodenode=stack.top();stack.pop();std::cout<<node->val<<'';if(node->right)stack.push(node->right);if(node->left)stack.push(node->left);}}解析:栈模拟递归,先压右后压左。4.最长有效括号:javascriptfunctionlongestValidParentheses(s){letmaxLen=0;constdp=Array(s.length).fill(0);for(leti=1;i<s.length;i++){if(s[i]===')'){if(s[i-1]==='('){dp[i]=(i>=2?dp[i-2]:0)+2;}elseif(i-dp[i-1]>0&&s[i-dp[i-1]-1]==='('){dp[i]=dp[i-1]+((i-dp[i-1])>=2?dp[i-dp[i-1]-2]:0)+2;}maxLen=Math.max(maxLen,dp[i]);}}returnmaxLen;}解析:动态规划,`dp[i]`表示以`i`结尾的最长有效括号。5.合并区间:pythondefmerge_intervals(intervals):ifnotintervals:return[]intervals.sort(key=lambdax:x[0])merged=[intervals[0]]forcurrentinintervals[1:]:last=merged[-1]ifcurrent[0]<=last[1]:last[1]=max(last[1],current[1])else:merged.append(current)returnmerged解析:排序后遍历合并重叠区间。算法题:1.滑动窗口最大值:javapublicstaticint[]maxSlidingWindow(int[]nums,intk){if(nums==null||nums.length==0||k==0)returnnewint[0];intn=nums.length;int[]res=newint[n-k+1];Deque<Integer>deque=newLinkedList<>();for(inti=0;i<n;i++){if(!deque.isEmpty()&&deque.peekFirst()<i-k+1){deque.pollFirst();}while(!deque.isEmpty()&&nums[i]>=nums[deque.peekLast()]){deque.pollLast();}deque.offerLast(i);if(i>=k-1){res[i-k+1]=nums[deque.peekFirst()];}}returnres;}解析:单调队列存储窗口最大值索引。2.快速排序:cppvoidquickSort(intarr[],intleft,intright){if(left

温馨提示

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

评论

0/150

提交评论