2026年IT行业软件工程师面试题及解答指南_第1页
2026年IT行业软件工程师面试题及解答指南_第2页
2026年IT行业软件工程师面试题及解答指南_第3页
2026年IT行业软件工程师面试题及解答指南_第4页
2026年IT行业软件工程师面试题及解答指南_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

2026年IT行业软件工程师面试题及解答指南一、编程题(共3题,每题20分)题目1(20分):实现一个LRU缓存机制要求:-设计一个LRU(LeastRecentlyUsed)缓存系统,支持get和put操作-get(key)-获取键key对应的值,如果键不存在返回-1-put(key,value)-插入或更新键值对。当缓存容量已满时,需要驱逐最久未使用的数据-使用双向链表和哈希表实现,保证O(1)时间复杂度示例:LRUCachecache=newLRUCache(2);cache.put(1,1);//缓存是{1=1}cache.put(2,2);//缓存是{1=1,2=2}cache.get(1);//返回1cache.put(3,3);//去除键2,缓存是{1=1,3=3}cache.get(2);//返回-1(未找到)cache.put(4,4);//去除键1,缓存是{4=4,3=3}cache.get(1);//返回-1(未找到)cache.get(3);//返回3cache.get(4);//返回4题目2(20分):字符串转换整数(atoi)要求:-实现atoi函数,将非负字符串转换为整数-忽略前导空格-处理正负号-当数字超过32位整数范围时,返回INT_MAX或INT_MIN-遇到非数字字符时停止转换示例:Input:"-42"Output:-42Explanation:Thefirstnon-whitespacecharacteris'-',whichistheminussign.Then,wereadthenextcharacteranditis'4'.Thisisnotawhitespacecharactersowestopreadingmorecharacters.Theparsedintegeris-42.题目3(20分):合并区间要求:-给定一个区间列表,合并所有重叠的区间-输出合并后的区间列表-区间用[start,end]表示,且start≤end示例:Input:[[1,3],[2,6],[8,10],[15,18]]Output:[[1,6],[8,10],[15,18]]Explanation:Sinceintervals[1,3]and[2,6]overlap,mergetheminto[1,6].二、算法题(共4题,每题15分)题目4(15分):二叉树的最大深度要求:-给定二叉树的根节点,返回二叉树的最大深度-最大深度是从根节点到最远叶子节点的最长路径上的节点数示例:输入:[3,9,20,null,null,15,7]输出:3解释:3/\920/\157题目5(15分):罗马数字转整数要求:-实现将罗马数字转换为整数-罗马数字由'I','V','X','L','C','D','M'组成-通常情况下,较小的数字在左边代表减法,在右边代表加法示例:Input:"MCMXCIV"Output:1994Explanation:M=1000,CM=900,XC=90,IV=4题目6(15分):搜索插入位置要求:-给定一个排序数组和一个目标值,返回目标值在数组中的插入位置-如果数组中存在目标值,返回其索引-如果不存在,返回它应该被插入的位置示例:Input:nums=[1,3,5,6],target=5Output:2题目7(15分):最长回文子串要求:-给定一个字符串,找到最长的回文子串的长度-可以使用动态规划或中心扩展法示例:Input:"babad"Output:3Explanation:"bab"or"aba"areboththelongestpalindromicsubstrings.三、系统设计题(共2题,每题25分)题目8(25分):设计一个简单的微博系统要求:-设计一个支持基本功能的微博系统-功能要求:发布微博、获取关注者的微博流、关注/取消关注-说明数据结构选择、主要接口设计、性能考虑题目9(25分):设计一个短链接系统要求:-设计一个短链接系统,实现长链接到短链接的转换-需要考虑:-链接转换的随机性和唯一性-高并发处理能力-定期清理无效链接-说明系统架构、数据存储方案、主要技术选型答案与解析编程题答案题目1:实现一个LRU缓存机制(20分)答案:javaclassLRUCache{privateintcapacity;privateMap<Integer,Node>map;privateNodehead,tail;classNode{intkey;intvalue;Nodeprev;Nodenext;Node(intkey,intvalue){this.key=key;this.value=value;}}publicLRUCache(intcapacity){this.capacity=capacity;map=newHashMap<>();head=newNode(0,0);tail=newNode(0,0);head.next=tail;tail.prev=head;}publicintget(intkey){Nodenode=map.get(key);if(node==null)return-1;moveToHead(node);returnnode.value;}publicvoidput(intkey,intvalue){Nodenode=map.get(key);if(node==null){NodenewNode=newNode(key,value);map.put(key,newNode);addToHead(newNode);if(map.size()>capacity){NodetoDel=tail.prev;removeNode(toDel);map.remove(toDel.key);}}else{node.value=value;moveToHead(node);}}privatevoidaddToHead(Nodenode){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}privatevoidremoveNode(Nodenode){node.prev.next=node.next;node.next.prev=node.prev;}privatevoidmoveToHead(Nodenode){removeNode(node);addToHead(node);}}解析:-使用双向链表维护访问顺序,头节点指向最近访问,尾节点指向最久未访问-哈希表实现O(1)时间复杂度的get操作-put操作时,如果键已存在则更新值并移动到头部;如果超出容量则删除尾节点-添加、删除、移动操作均通过调整指针实现,保证O(1)复杂度题目2:字符串转换整数(atoi)(15分)答案:javapublicclassSolution{publicintmyAtoi(Strings){if(s==null||s.length()==0)return0;inti=0,n=s.length();intsign=1;longresult=0;//去除前导空格while(i<n&&s.charAt(i)=='')i++;//处理正负号if(i<n&&(s.charAt(i)=='+'||s.charAt(i)=='-')){sign=(s.charAt(i)=='-')?-1:1;i++;}//转换数字while(i<n){charc=s.charAt(i);if(c<'0'||c>'9')break;result=result10+(c-'0');//检查溢出if(sign==1&&result>Integer.MAX_VALUE)returnInteger.MAX_VALUE;if(sign==-1&&-result<Integer.MIN_VALUE)returnInteger.MIN_VALUE;i++;}return(int)(signresult);}}解析:-遵循"去除空格→解析符号→转换数字→检查溢出"的逻辑-使用long类型存储中间结果避免溢出问题-对INT_MAX/INT_MIN进行判断,确保在32位整数范围内-遇到非数字字符时立即停止转换,不处理后续字符题目3:合并区间(15分)答案:javapublicclassSolution{publicint[][]merge(int[][]intervals){if(intervals==null||intervals.length==0)returnnewint[0][2];//按起点排序Arrays.sort(intervals,(a,b)->Ipare(a[0],b[0]));List<int[]>result=newArrayList<>();int[]prev=intervals[0];result.add(prev);for(inti=1;i<intervals.length;i++){int[]curr=intervals[i];if(prev[1]>=curr[0]){//重叠prev[1]=Math.max(prev[1],curr[1]);}else{//不重叠prev=curr;result.add(prev);}}returnresult.toArray(newint[result.size()][]);}}解析:-先按区间的起始位置进行排序-遍历排序后的区间列表,比较当前区间与结果列表中最后一个区间的终点-如果重叠则合并(更新终点为两者最大值),否则添加新区间-最终结果转换为二维数组返回答案与解析(续)算法题答案题目4:二叉树的最大深度(15分)答案:java//递归解法publicclassSolution{publicintmaxDepth(TreeNoderoot){if(root==null)return0;return1+Math.max(maxDepth(root.left),maxDepth(root.right));}}//迭代解法(BFS)publicclassSolution{publicintmaxDepth(TreeNoderoot){if(root==null)return0;intdepth=0;Queue<TreeNode>queue=newLinkedList<>();queue.offer(root);while(!queue.isEmpty()){depth++;intsize=queue.size();for(inti=0;i<size;i++){TreeNodenode=queue.poll();if(node.left!=null)queue.offer(node.left);if(node.right!=null)queue.offer(node.right);}}returndepth;}}解析:-递归解法:递归计算左右子树深度,取最大值加1-迭代解法(BFS):层序遍历,每层深度+1-时间复杂度:O(n),n为节点数-空间复杂度:递归解法O(h),迭代解法O(n)题目5:罗马数字转整数(15分)答案:javapublicclassSolution{publicintromanToInt(Strings){if(s==null||s.length()==0)return0;Map<Character,Integer>map=newHashMap<>();map.put('I',1);map.put('V',5);map.put('X',10);map.put('L',50);map.put('C',100);map.put('D',500);map.put('M',1000);intresult=0;intprev=0;for(inti=s.length()-1;i>=0;i--){intcurr=map.get(s.charAt(i));if(curr<prev){result-=curr;}else{result+=curr;prev=curr;}}returnresult;}}解析:-从右向左遍历罗马数字-如果当前值小于前一个值,则减去当前值(表示减法情况)-否则加上当前值(表示加法情况)-使用哈希表存储罗马数字对应值,提高查找效率-时间复杂度:O(n),n为字符串长度-空间复杂度:O(1),哈希表大小固定题目6:搜索插入位置(15分)答案:javapublicclassSolution{publicintsearchInsert(int[]nums,inttarget){intleft=0,right=nums.length-1;while(left<=right){intmid=left+(right-left)/2;if(nums[mid]==target)returnmid;if(nums[mid]<target)left=mid+1;elseright=mid-1;}returnleft;}}解析:-二分查找变体-如果找到target,返回索引-如果未找到,left指向第一个大于target的位置-对于[1,3,5,6]target=5,left最终会指向索引2-对于target=2,left最终指向索引1-对于target=7,left最终指向索引4(插入位置)-时间复杂度:O(logn)-空间复杂度:O(1)题目7:最长回文子串(15分)答案:javapublicclassSolution{publicStringlongestPalindrome(Strings){if(s==null||s.length()<1)return"";intstart=0,end=0;for(inti=0;i<s.length();i++){intlen1=expandAroundCenter(s,i,i);intlen2=expandAroundCenter(s,i,i+1);intlen=Math.max(len1,len2);if(len>end-start){start=i-(len-1)/2;end=i+len/2;}}returns.substring(start,end+1);}privateintexpandAroundCenter(Strings,intleft,intright){while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){left--;right++;}returnright-left-1;}}解析:-中心扩展法:每个字符(或字符间)作为中心,向两边扩展-考虑两种情况:奇数长度回文(如"aba")和偶数长度回文(如"abba")-记录最大回文子串的起始和结束位置-时间复杂度:O(n^2)-空间复杂度:O(1)系统设计题答案题目8:设计一个简单的微博系统(25分)要求:-设计支持基本功能的微博系统-功能要求:发布微博、获取关注者的微博流、关注/取消关注-说明数据结构选择、主要接口设计、性能考虑答案:1.数据模型设计:-用户(User):用户ID、昵称、关注列表、粉丝列表-微博(Tweet):微博ID、用户ID、内容、发布时间、点赞数-关注关系(Follow):用户ID、关注用户ID2.核心接口设计:java//用户相关interfaceUserService{UsergetUser(StringuserId);voidfollowUser(StringuserId,StringfollowId);voidunfollowUser(StringuserId,StringfollowId);}//微博相关interfaceTweetService{TweetpostTweet(StringuserId,Stringcontent);List<Tweet>getTimeline(StringuserId);List<Tweet>getFeed(StringuserId);voidlikeTweet(StringuserId,StringtweetId);}3.系统架构:-数据存储:-用户和关注关系:关系型数据库(如MySQL)-微博:NoSQL数据库(如MongoDB)或分片存储-缓存层:Redis

温馨提示

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

评论

0/150

提交评论