工程师岗位面试题库及系统设计案例分析含答案_第1页
工程师岗位面试题库及系统设计案例分析含答案_第2页
工程师岗位面试题库及系统设计案例分析含答案_第3页
工程师岗位面试题库及系统设计案例分析含答案_第4页
工程师岗位面试题库及系统设计案例分析含答案_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

2026年工程师岗位面试题库及系统设计案例分析含答案一、编程语言与数据结构(共5题,每题10分)1.题目:请用Python实现一个函数,输入一个正整数n,返回其二进制表示中1的个数。要求时间复杂度为O(1)。2.题目:给定一个包含重复元素的数组nums,请设计一个算法,找出数组中不重复的子数组数量。例如,nums=[1,2,1],不重复的子数组有[1]、[2]、[1]、[1,2]、[2,1]、[1,2,1],但[1,1]和[2,1,1]被忽略。3.题目:请用Java实现一个LRU(LeastRecentlyUsed)缓存,支持get和put操作。要求空间复杂度为O(n),时间复杂度为O(1)。4.题目:给定一棵二叉树,请判断其是否为平衡二叉树。平衡二叉树是指任意节点的左右子树高度差不超过1。5.题目:请用C++实现快速排序算法,要求随机选择pivot以优化性能。二、数据库与SQL(共4题,每题10分)1.题目:假设有一个订单表orders(order_id,user_id,amount,order_time),请写SQL查询最近一个月内每个用户的总订单金额,并按金额降序排列。2.题目:请用SQL实现一个触发器,当向orders表插入新数据时,自动更新一个汇总表order_summary(user_id,total_amount),如果用户不存在则先插入该用户。3.题目:假设有一个学生表students(student_id,name,class_id)和班级表classes(class_id,class_name),请写SQL查询每个班级的学生人数,并排除空班级。4.题目:请设计一个分页查询的SQL语句,从orders表中查询第10页的数据(每页10条),要求使用limit和offset。三、系统设计(共3题,每题20分)1.题目:设计一个高并发的短链接生成系统。要求:-支持秒级过期。-高可用、高扩展。-输出短链接的URL需要包含随机字符(如62位base62编码)。2.题目:设计一个类似微博的实时消息推送系统。要求:-支持百万级用户。-消息按时间顺序推送。-支持离线推送(用户不在线时仍能收到消息)。3.题目:设计一个分布式限流系统。要求:-支持分钟级和秒级限流。-兼容突发流量。-提供可视化的流量监控。四、算法与数据结构(共3题,每题15分)1.题目:给定一个字符串s,请判断其是否为有效括号字符串(只包含()[]{},且括号匹配)。例如,s="()"为真,s="(]"为假。2.题目:请设计一个算法,找出数组中第k大的元素。要求不排序,时间复杂度为O(n)。3.题目:给定一个链表,请反转其前n个节点。例如,链表为1->2->3->4->5,n=2,反转后为2->1->3->4->5。五、项目经验与场景题(共2题,每题25分)1.题目:假设你要重构一个电商平台的订单处理模块,该模块目前存在以下问题:-代码耦合度高。-数据库查询慢。-并发请求时订单状态易出错。请提出你的重构方案,并说明如何解决上述问题。2.题目:某公司需要建设一个秒杀系统,要求:-支持百万级用户同时抢购。-防止超卖和刷单。-系统响应时间控制在200ms内。请说明你的技术选型和实现思路。答案与解析一、编程语言与数据结构1.答案(Python):pythondefcount_bits(n):returnbin(n).count('1')解析:二进制字符串中'1'的个数可以直接用bin(n)转换为二进制,再用count('1')统计。时间复杂度为O(1),因为二进制位数与n的对数成正比。2.答案(Python):pythondefcount_unique_subarrays(nums):fromcollectionsimportdefaultdictn=len(nums)count=0foriinrange(n):seen=set()forjinrange(i,n):ifnums[j]inseen:breakseen.add(nums[j])count+=1returncount解析:使用滑动窗口+集合去重。遍历所有子数组,用集合记录已出现的元素,若遇到重复则停止当前子数组遍历。时间复杂度为O(n²),但实际测试中可优化至O(n²),因集合操作平均时间复杂度为O(1)。3.答案(Java):javaimportjava.util.HashMap;importjava.util.Map;classLRUCache{privateMap<Integer,Node>map;privateNodehead,tail;privateintcapacity;classNode{intkey,value;Nodeprev,next;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){if(map.containsKey(key)){Nodenode=map.get(key);moveToHead(node);returnnode.value;}return-1;}publicvoidput(intkey,intvalue){if(map.containsKey(key)){Nodenode=map.get(key);node.value=value;moveToHead(node);}else{Nodenode=newNode(key,value);map.put(key,node);addToHead(node);if(map.size()>capacity){NodetoRemove=tail.prev;removeNode(toRemove);map.remove(toRemove.key);}}}privatevoidmoveToHead(Nodenode){removeNode(node);addToHead(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;}}解析:使用双向链表+哈希表实现LRU。链表头为最近使用节点,尾为最久未使用节点。get时移动节点至头部,put时若存在则更新并移动,否则新增并删除最久未使用节点。4.答案(Java):javapublicclassTreeNode{intval;TreeNodeleft,right;TreeNode(intx){val=x;}}publicbooleanisBalanced(TreeNoderoot){returncheckHeight(root)!=-1;}privateintcheckHeight(TreeNodenode){if(node==null)return0;intleftHeight=checkHeight(node.left);if(leftHeight==-1)return-1;intrightHeight=checkHeight(node.right);if(rightHeight==-1||Math.abs(leftHeight-rightHeight)>1)return-1;returnMath.max(leftHeight,rightHeight)+1;}解析:递归检查每个节点的左右子树高度差。若任意节点不平衡,则整棵树不平衡,返回-1。否则返回高度。时间复杂度为O(n)。5.答案(C++):cppinclude<vector>include<cstdlib>intpartition(std::vector<int>&nums,intleft,intright){intpivot=nums[rand()%(right-left+1)+left];inti=left,j=right;while(i<j){while(i<j&&nums[j]>=pivot)j--;if(i<j)nums[i++]=nums[j];while(i<j&&nums[i]<=pivot)i++;if(i<j)nums[j--]=nums[i];}nums[i]=pivot;returni;}voidquickSort(std::vector<int>&nums,intleft,intright){if(left<right){intpivotIdx=partition(nums,left,right);quickSort(nums,left,pivotIdx-1);quickSort(nums,pivotIdx+1,right);}}解析:随机选择pivot可优化性能,避免最坏情况(已排序数组)。partition函数将小于pivot的放左边,大于的放右边,返回pivot最终位置。递归排序左右子数组。二、数据库与SQL1.答案(SQL):sqlSELECTuser_id,SUM(amount)AStotal_amountFROMordersWHEREorder_time>=DATE_SUB(NOW(),INTERVAL1MONTH)GROUPBYuser_idORDERBYtotal_amountDESC;解析:使用DATE_SUB计算最近一个月的时间范围,GROUPBY按用户分组,SUM计算总金额,ORDERBY降序排列。2.答案(SQL):sqlDELIMITER//CREATETRIGGERafter_insert_orderAFTERINSERTONordersFOREACHROWBEGININSERTINTOorder_summary(user_id,total_amount)VALUES(NEW.user_id,NEW.amount)ONDUPLICATEKEYUPDATEtotal_amount=total_amount+NEW.amount;END//DELIMITER;解析:触发器在插入orders后执行,若order_summary中已存在该用户则更新金额,否则插入新记录。ONDUPLICATEKEY用于处理重复主键。3.答案(SQL):sqlSELECTclasses.class_name,COUNT(students.student_id)ASstudent_countFROMclassesLEFTJOINstudentsONclasses.class_id=students.class_idGROUPBYclasses.class_idHAVINGCOUNT(students.student_id)>0;解析:LEFTJOIN确保空班级也参与统计,HAVINGCOUNT(students.student_id)>0排除空班级。4.答案(SQL):sqlSELECTFROMordersLIMIT10OFFSET90;解析:limit10表示每页10条,offset90表示跳过前90条,即第10页数据。三、系统设计1.答案:方案:-使用Redis缓存短链接映射(short_id<->long_url)。-短链接使用62位base62编码(a-z,A-Z,0-9),支持随机生成。-过期逻辑在Redis中设置TTL(如5分钟)。-高可用:使用Redis集群,短链接服务部署多副本。架构图:用户请求->负载均衡器->短链接服务(查询Redis缓存)若缓存未命中:生成short_id->查询long_url->缓存映射->返回短链接2.答案:方案:-消息队列(Kafka/RabbitMQ)存储用户消息。-实时推送:WebSocket连接用户端。-离线推送:用户登录时查询未读消息。-超时未读:短信/邮件提醒。架构图:用户->WebSocket服务->消息队列->推送服务离线用户->消息队列->登录时同步消息3.答案:方案:-使用Redis/Zookeeper实现令牌桶算法。-每秒生成固定令牌,超限请求拒绝或排队。-流量监控:Prometheus+Grafana可视化。架构图:用户请求->限流服务(Redis计数)->业务服务监控:Prometheus采集限流数据->Grafana展示四、算法与数据结构1.答案(Python):pythondefisValid(s):stack=[]mapping={')':'(','}':'{',']':'['}forcharins:ifcharinmapping.values():stack.append(char)elifcharinmapping:ifnotstackorstack.pop()!=mapping[char]:returnFalseelse:returnFalsereturnnotstack解析:用栈匹配括号,左括号入栈,右括号匹配栈顶,若匹配则弹出,否则无效。最后栈为空则有效。2.答案(Java):javaimportjava.util.PriorityQueue;publicintfindKthLargest(int[]nums,intk){PriorityQueue<Integer>minHeap=newPriorityQueue<>(k);for(intnum:nums){if(minHeap.size()<k){minHeap.offer(num);}elseif(num>minHeap.peek()){minHeap.poll();minHeap.offer(num);}}returnminHeap.peek();}解析:维护一个大小为k的最小堆,遍历数组,新元素大于堆顶则替换。最后堆顶为第k大元素。3.答案(Python):pythondefreverseList(head,

温馨提示

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

最新文档

评论

0/150

提交评论