2026年软件工程师面试技巧与题目_第1页
2026年软件工程师面试技巧与题目_第2页
2026年软件工程师面试技巧与题目_第3页
2026年软件工程师面试技巧与题目_第4页
2026年软件工程师面试技巧与题目_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

2026年软件工程师面试技巧与题目一、编程题(共5题,每题20分,总分100分)1.编程题1(20分):字符串反转题目:给定一个字符串`s`,原地反转字符串中的字符顺序。不使用额外的内存空间(即不使用其他字符串变量),要求时间复杂度为O(n)。示例:输入:`"hello"`输出:`"olleh"`答案与解析:javapublicvoidreverseString(char[]s){intleft=0,right=s.length-1;while(left<right){chartemp=s[left];s[left]=s[right];s[right]=temp;left++;right--;}}解析:通过双指针法,从字符串的两端向中间遍历,交换字符,直到`left`和`right`相遇。该方法不使用额外空间,时间复杂度为O(n),空间复杂度为O(1)。2.编程题2(20分):合并两个有序数组题目:给定两个有序数组`nums1`和`nums2`,合并它们为一个有序数组,合并后的数组存储在`nums1`中(`nums1`有足够的空间容纳`nums2`的元素)。示例:输入:`nums1=[1,2,3,0,0,0],nums2=[2,5,6]`输出:`[1,2,2,3,5,6]`答案与解析:javapublicvoidmerge(int[]nums1,intm,int[]nums2,intn){intp1=m-1,p2=n-1,p=m+n-1;while(p1>=0&&p2>=0){if(nums1[p1]>nums2[p2]){nums1[p]=nums1[p1];p1--;}else{nums1[p]=nums2[p2];p2--;}p--;}while(p2>=0){nums1[p]=nums2[p2];p2--;p--;}}解析:从后向前合并,比较`nums1`和`nums2`的元素,将较大的元素放在`nums1`的末尾。这种方法避免了额外的空间使用,时间复杂度为O(m+n),空间复杂度为O(1)。3.编程题3(20分):二叉树的最大深度题目:给定一个二叉树,返回它的最大深度(即从根节点到最远叶子节点的最长路径上的节点数)。示例:输入:`[3,9,20,null,null,15,7]`输出:`3`答案与解析:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefmaxDepth(root):ifnotroot:return0return1+max(maxDepth(root.left),maxDepth(root.right))解析:使用递归方法,计算左子树和右子树的最大深度,取较大值并加1(当前节点)。时间复杂度为O(n),空间复杂度为O(h)(h为树的高度)。4.编程题4(20分):滑动窗口最大值题目:给定一个数组`nums`和一个整数`k`,找到长度为`k`的连续子数组中最大的元素。示例:输入:`nums=[1,3,-1,-3,5,3,6,7],k=3`输出:`[3,3,5,5,6,7]`答案与解析:javaimportjava.util.Deque;importjava.util.LinkedList;publicint[]maxSlidingWindow(int[]nums,intk){Deque<Integer>deque=newLinkedList<>();intn=nums.length;int[]res=newint[n-k+1];for(inti=0;i<n;i++){//移除不在窗口内的元素if(!deque.isEmpty()&&deque.peekFirst()==i-k){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;}解析:使用双端队列维护窗口内的最大值,队列头部存储当前窗口的最大值索引。每次滑动窗口时,移除不在窗口内的元素,并保持队列单调递减。时间复杂度为O(n),空间复杂度为O(k)。5.编程题5(20分):字符串匹配题目:实现`strStr`函数,找到字符串`haystack`中`needle`第一次出现的索引,如果未找到则返回-1。示例:输入:`haystack="hello",needle="ll"`输出:`2`答案与解析:javapublicintstrStr(Stringhaystack,Stringneedle){if(needle.isEmpty())return0;intn=haystack.length(),m=needle.length();for(inti=0;i<=n-m;i++){intj;for(j=0;j<m;j++){if(haystack.charAt(i+j)!=needle.charAt(j))break;}if(j==m)returni;}return-1;}解析:暴力匹配法,从`haystack`的每个位置开始,与`needle`逐字符比较,如果全部匹配则返回当前索引。时间复杂度为O(nm),空间复杂度为O(1)。二、系统设计题(共2题,每题50分,总分100分)1.系统设计题1(50分):设计一个短链接系统题目:设计一个短链接系统(如TinyURL),用户输入长链接,系统返回一个短链接,点击短链接可自动跳转到长链接。要求:1.短链接长度尽可能短(如`/abc123`)。2.支持高并发访问。3.能够快速解析短链接到长链接。答案与解析:系统架构:1.数据库:存储长链接与短链接的映射关系(使用Redis或MySQL)。2.API服务:处理用户请求,生成短链接和解析短链接。3.短链接生成算法:使用Base62编码(a-z,A-Z,0-9),将ID转换为短字符串。4.缓存:使用内存缓存(如Redis)加速短链接解析。代码示例(短链接生成):pythonimportbase64importhashlibdefencode_id(id):使用Base62编码chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"base=len(chars)encoded=""whileid>0:encoded=chars[id%base]+encodedid//=basereturnencodeddefgenerate_short_url(long_url):使用MD5生成唯一IDhash_obj=hashlib.md5(long_url.encode())id=int(hash_obj.hexdigest(),16)short_id=encode_id(id)returnf"/{short_id}"解析:-Base62编码:将数字转换为62个字符的组合,缩短短链接长度。-高并发处理:使用分布式缓存和数据库读写分离,支持高并发访问。-解析效率:通过Redis缓存热点短链接,减少数据库查询。2.系统设计题2(50分):设计一个微博系统题目:设计一个微博系统,用户可以发布、关注、点赞、评论微博。要求:1.支持实时推送(如使用WebSocket)。2.支持分页加载(如每页20条微博)。3.优化点赞和关注关系的查询性能。答案与解析:系统架构:1.数据库:-用户表(`users`):存储用户信息。-微博表(`tweets`):存储微博内容,关联用户ID和发布时间。-关注关系表(`follows`):存储用户关注关系,支持多表联合查询。-点赞表(`likes`):存储用户对微博的点赞关系。2.缓存:使用Redis缓存热门微博和用户关注列表。3.消息队列:使用Kafka或RabbitMQ处理实时推送。代码示例(发布微博):javapublicclassTweetService{//发布微博publicTweetpublishTweet(intuserId,Stringcontent){Tweettweet=newTweet();tweet.setUserId(userId);tweet.setContent(content);tweet.setCreateTime(newDate());tweetRepository.save(tweet);//推送给关注者notifyFollowers(userId,tweet);returntweet;}//推送给关注者privatevoidnotifyFollowers(intuserId,Tweettweet){Set<Integer>followers=followRepository.getFollowers(userId);for(intfollowerId:followers){messageQueue.send(followerId,tweet);}}}解析:-实时推送:使用WebSocket或消息队列实现实时通知。-分页加载:微博表按发布时间倒序查询,支持LIMIT分页。-查询优化:关注关系使用多表联合查询或索引优化,点赞关系使用Redis缓存热门微博。三、算法题(共3题,每题33分,总分99分)1.算法题1(33分):N皇后问题题目:给定一个整数`n`,返回所有不同的`n`皇后问题的解决方案。每个解决方案包含一个明确的`n`皇后放置方式,其中`'Q'`和`'.'`分别代表一个皇后和一个空位。示例:输入:`n=4`输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]答案与解析:javaimportjava.util.ArrayList;importjava.util.List;publicclassSolution{publicList<List<String>>solveNQueens(intn){List<List<String>>res=newArrayList<>();dfs(n,0,newint[n],newboolean[n],newboolean[2n-1],res);returnres;}privatevoiddfs(intn,introw,int[]cols,boolean[]diagonals,boolean[]antiDiagonals,List<List<String>>res){if(row==n){List<String>board=newArrayList<>();for(intc:cols){StringBuildersb=newStringBuilder();for(intj=0;j<n;j++){sb.append(j==c?'Q':'.');}board.add(sb.toString());}res.add(board);return;}for(intc=0;c<n;c++){intmask=1<<c;intdiagonal=row-c+n-1;intantiDiagonal=row+c;if(cols[c]||diagonals[diagonal]||antiDiagonals[antiDiagonal]){continue;}cols[c]=1;diagonals[diagonal]=1;antiDiagonals[antiDiagonal]=1;dfs(n,row+1,cols,diagonals,antiDiagonals,res);cols[c]=0;diagonals[diagonal]=0;antiDiagonals[antiDiagonal]=0;}}}解析:使用回溯法,通过列、主对角线和副对角线的掩码(mask)来避免冲突。时间复杂度为O(n!),空间复杂度为O(n)。2.算法题2(33分):最长有效括号题目:给定一个只包含`'('`和`')'`的字符串,找到最长有效(括号匹配)的子串的长度。示例:输入:`"(()"`输出:`2`答案与解析:javapublicintlongestValidParentheses(Strings){intmaxLen=0;int[]dp=newint[s.length()];for(inti=1;i<s.length();i++){if(s.charAt(i)==')'){if(s.charAt(i-1)=='('){dp[i]=(i>=2?dp[i-2]:0)+2;}elseif(i-dp[i-1]>0&&s.charAt(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`结尾的最长有效括号长度。通过检查前一个字符和前`dp[i-1]`个字符,动态更新最大长度。时间复杂度为O(n),空间复杂度为O(n)。3.算法题3(33分):四数相加II题目:给定四个包含整数的数组,返回所有可能的不重复的四元组`[a,b,c,d]`,满足`a+b+c+d==target`。示例:输入:`nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,2]`,target=`0`输出:`[[-2,-1,1,2],[-2,0,0,2],[-1,-1,1,1]]`答案与解析:javaimportjava.util.;publicclassSolution{publicList<List<Integer>>fourSum(int[]nu

温馨提示

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

最新文档

评论

0/150

提交评论