版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年工程师面试题目及答案一、编程能力测试(共5题,每题10分,总分50分)题目1(Java编程,10分)请用Java编写一个方法,实现将一个字符串中的所有空格替换为"%20"。要求不使用现成的替换函数,并考虑字符串可能为null的情况。答案:javapublicclassStringReplace{publicstaticStringreplaceSpaces(Strings){if(s==null){returnnull;}//首先统计空格数量intspaceCount=0;for(inti=0;i<s.length();i++){if(s.charAt(i)==''){spaceCount++;}}//创建新字符串数组,长度为原字符串长度+空格数2char[]result=newchar[s.length()+spaceCount2];intj=0;for(inti=0;i<s.length();i++){charc=s.charAt(i);if(c==''){result[j++]='%';result[j++]='2';result[j++]='0';}else{result[j++]=c;}}returnnewString(result,0,j);}publicstaticvoidmain(String[]args){System.out.println(replaceSpaces("HelloWorldJava"));}}解析:1.首先判断输入字符串是否为null,这是基本的空值检查2.遍历原字符串统计空格数量,为后续数组扩容做准备3.创建新字符数组,长度为原字符串长度+空格数×2(每个空格替换为3个字符)4.重新遍历原字符串,将非空格字符直接复制,空格字符则替换为"%20"5.使用String构造函数创建最终结果字符串这种方法的时间复杂度为O(n),空间复杂度为O(n),比直接使用String的replace方法更高效,特别是在大量空格的情况下。题目2(Python编程,10分)请用Python实现一个函数,检查一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都相同的整数。例如,121是回文数,而123不是。答案:pythondefis_palindrome(x):负数不是回文数ifx<0:returnFalse单数位是回文数ifx>=0andx<10:returnTrue末尾为0的非0数不是回文数ifx%10==0:returnFalsereversed_number=0whilex>reversed_number:reversed_number=reversed_number10+x%10x=x//10当数字长度为奇数时,可以通过reversed_number//10去除中间的数字当数字长度为偶数时,reversed_number和x相等returnx==reversed_numberorx==reversed_number//10测试用例print(is_palindrome(121))#Trueprint(is_palindrome(-121))#Falseprint(is_palindrome(10))#Falseprint(is_palindrome(12321))#True解析:1.负数不是回文数,因为负号会导致正反顺序不同2.单位数(0-9)都是回文数3.末尾为0的数不是回文数,因为开头不能为04.使用反转数字的方法:-将原数字不断取出最后一位添加到反转数字中-当原数字小于或等于反转数字时停止-此时如果原数字等于反转数字或原数字除以10等于反转数字(处理奇数位情况),则是回文数这种方法的时间复杂度为O(logn),空间复杂度为O(1),比将数字转为字符串的方法更高效。题目3(JavaScript编程,10分)请用JavaScript实现一个函数,找出数组中所有不重复的元素。要求时间复杂度为O(n)。答案:javascriptfunctionfindUniqueElements(arr){constelementCount={};constuniqueElements=[];//统计每个元素出现的次数for(constelementofarr){if(elementCount[element]){elementCount[element]++;}else{elementCount[element]=1;}}//添加只出现一次的元素到结果数组for(const[element,count]ofObject.entries(elementCount)){if(count===1){uniqueElements.push(Number(element));}}returnuniqueElements;}//测试用例console.log(findUniqueElements([1,2,2,3,4,4,5]));//[1,3,5]console.log(findUniqueElements(["apple","banana","apple","orange"]));//["banana","orange"]解析:1.使用对象(哈希表)记录每个元素出现的次数2.遍历数组,统计每个元素的出现频率3.再次遍历哈希表,将出现次数为1的元素添加到结果数组4.返回结果数组这种方法的时间复杂度为O(n),空间复杂度为O(n),是最优解法之一。如果题目要求不使用额外空间,可以考虑先排序后遍历的方法,但时间复杂度会增加到O(nlogn)。题目4(C++编程,10分)请用C++实现一个函数,计算一个整数数组的中位数。要求不使用排序,时间复杂度为O(n)。答案:cppinclude<vector>include<algorithm>doublefindMedian(std::vector<int>&nums){intn=nums.size();if(n==0){return0.0;}//快速选择算法找到中位数//这里使用标准库的nth_element实现if(n%2==1){//奇数长度,直接找中间的数nth_element(nums.begin(),nums.begin()+n/2,nums.end());returnnums[n/2];}else{//偶数长度,找中间两个数的平均值nth_element(nums.begin(),nums.begin()+n/2-1,nums.end());inta=nums[n/2-1];nth_element(nums.begin(),nums.begin()+n/2,nums.end());intb=nums[n/2];return(a+b)/2.0;}}//测试用例include<iostream>intmain(){std::vector<int>v1={3,1,2,4,5};std::cout<<findMedian(v1)<<std::endl;//3std::vector<int>v2={1,2,3,4,5,6};std::cout<<findMedian(v2)<<std::endl;//3.5}解析:1.使用C++标准库中的nth_element函数,该函数可以在O(n)时间内找到第k小的元素,且保持原始数组部分有序2.对于奇数长度的数组,直接找中间位置的元素3.对于偶数长度的数组,分别找中间两个位置的元素并计算平均值4.nth_element的时间复杂度为O(n),比完全排序的O(nlogn)更高效这种方法是计算中位数的高效方法,特别适合大数据集。如果数据量非常小,可以使用简单排序的方法。题目5(Go编程,10分)请用Go语言实现一个函数,将一个罗马数字转换为整数。罗马数字由I、V、X、L、C、D、M七个符号组成,其中I=1、V=5、X=10、L=50、C=100、D=500、M=1000。罗马数字的计算规则是:小数在右,大数在左时相加;小数在左,大数在右时相减。答案:gopackagemainimport("fmt""strings")funcromanToInt(sstring)int{//罗马数字到整数的映射romanMap:=map[byte]int{'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,}//首先将字符串转为小写字符数组s=strings.ToUpper(s)nums:=[]byte(s)total:=0prevValue:=0//从右向左遍历fori:=len(nums)-1;i>=0;i--{value:=romanMap[nums[i]]ifvalue<prevValue{total-=value}else{total+=value}prevValue=value}returntotal}funcmain(){fmt.Println(romanToInt("III"))//3fmt.Println(romanToInt("IV"))//4fmt.Println(romanIntArray("IX"))//9fmt.Println(romanIntArray("LVIII"))//58fmt.Println(romanIntArray("MCMXCIV"))//1994}解析:1.创建罗马数字到整数的映射表2.将输入字符串转为大写,确保处理一致3.从右向左遍历罗马数字:-如果当前值小于前一个值,则减去当前值(表示相减规则)-否则加上当前值(表示相加规则)4.更新前一个值的记录这种方法的时间复杂度为O(n),空间复杂度为O(1)。从右向左遍历比从左向右更高效,因为每次只需要与前一个值比较。二、系统设计测试(共3题,每题15分,总分45分)题目6(分布式系统设计,15分)设计一个高并发的短链接系统。要求:1.输入长链接后能快速生成短链接2.支持高并发访问3.能统计每个短链接的访问次数4.系统应具备一定的容错能力答案:1.系统架构:-使用无状态的服务架构,所有请求都可以发送到任何节点-部署多个服务实例,使用负载均衡器分发请求-使用Redis集群存储短链接映射关系和访问统计2.短链接生成:-使用自增ID+Base62编码:-将自增ID映射为62进制表示(a-z,A-Z,0-9)-例如:ID123456789->"7D4B"(62进制)-使用分布式ID生成器(如Twitter的Snowflake算法)生成唯一ID-限制短链接长度(6-8位即可表示超过10^9的ID)3.高并发支持:-使用无锁设计,所有写操作都通过Redis事务完成-使用异步IO处理请求,避免阻塞-设置合理的超时时间,防止慢请求拖慢系统4.访问统计:-每次访问时,通过Redis的INCR命令原子性增加计数-将统计结果缓存到本地,定期同步到数据库-提供API查询统计信息5.容错能力:-使用Redis集群,保证数据高可用-服务实例部署在多个可用区-使用熔断器防止级联故障-定期备份数据6.性能优化:-使用CDN缓存静态资源-设置合理的TTL,过期短链接自动清理-使用缓存预热,避免首次访问慢解析:1.系统设计要考虑高并发、高可用、可扩展性2.短链接生成要保证唯一性和可读性3.Redis是理想的缓存和计数工具,其原子操作保证数据一致性4.无状态设计简化了水平扩展5.容错能力是大型系统的重要指标题目7(数据库设计,15分)设计一个社交媒体的数据库模型。要求:1.支持用户注册和登录2.支持发布帖子、评论、点赞3.支持关注/取消关注功能4.支持搜索功能答案:1.核心表设计:-users:存储用户信息-id(PK,UUID)-username(UNIQUE)-password_hash-email(UNIQUE)-created_at-updated_at-posts:存储帖子信息-id(PK,UUID)-user_id(FK)-content-created_at-updated_at-comments:存储评论信息-id(PK,UUID)-post_id(FK)-user_id(FK)-content-created_at-updated_at-likes:存储点赞信息(多表联合设计)-id(PK,UUID)-user_id(FK)-post_id(FK)-created_at-follows:存储关注关系(双向)-follower_id(FK)-followee_id(FK)-created_at2.索引设计:-users:username,email-posts:user_id,created_at-comments:post_id,user_id-likes:user_id,post_id-follows:follower_id,followee_id(UNIQUE组合)3.搜索功能:-使用Elasticsearch索引帖子内容和用户信息-实现全文搜索和模糊匹配-支持按用户、时间、关键词搜索4.性能优化:-使用分区表存储历史数据-使用缓存(Redis)存储热点数据-对于点赞数、粉丝数等频繁访问的计数字段,使用Redis计数5.安全性考虑:-密码使用bcrypt加盐存储-使用JWT或OAuth进行身份验证-限制请求频率防止滥用解析:1.数据库设计要考虑数据一致性、扩展性和性能2.社交媒体系统需要处理大量的关系数据,需要合理设计表结构3.索引是提高查询性能的关键4.缓存可以显著提升系统响应速度题目8(微服务设计,15分)设计一个电商平台的订单系统。要求:1.支持创建订单、支付、取消订单2.与库存系统、支付系统、物流系统交互3.处理订单状态变更4.支持事务性操作答案:1.系统架构:-使用事件驱动架构,通过消息队列解耦服务-订单服务作为核心服务,其他系统通过API网关访问-使用分布式事务管理器(如Seata)保证跨服务事务2.核心流程设计:-创建订单:-订单服务接收请求-查询库存系统确认库存-库存系统扣减库存并返回结果-订单服务创建订单,状态为"待支付"-发布"订单创建"事件到消息队列-支付:-支付系统处理支付请求-支付成功后发布"订单支付"事件-取消订单:-根据订单状态执行不同操作-待支付:直接取消-待发货:通知库存恢复库存-已发货:创建售后流程3.状态机设计:-使用状态机管理订单状态:-待支付->待发货->已发货->已完成/已取消-每个状态变更都触发相应事件4.服务交互:-使用RESTAPI或gRPC进行服务间通信-使用JWT进行认证授权-使用DTO(数据传输对象)进行数据传输5.事务管理:-使用本地消息表实现最终一致性-使用分布式事务框架处理跨服务事务-设置合理的事务隔离级别6.扩展性设计:-使用分片数据库存储订单数据-使用缓存(Redis)存储热点订单-使用读写分离提高查询性能7.监控告警:-使用Prometheus监控服务性能-使用ELK堆栈进行日志分析-设置关键业务指标的告警解析:1.微服务设计要考虑服务边界、通信机制和事务管理2.事件驱动架构可以提高系统的弹性和可扩展性3.状态机是管理复杂业务流程的有效工具4.最终一致性设计比强一致性更实用,特别是在分布式系统三、算法与数据结构测试(共3题,每题15分,总分45分)题目9(算法题,15分)给定一个二维矩阵,每个元素都是非负整数。请找出一条从左上角到右下角的路径,使得路径上的数字之和最小。路径只能从左或右移动。答案:pythondefminPathSum(grid):ifnotgridornotgrid[0]:return0rows,cols=len(grid),len(grid[0])初始化第一行forjinrange(1,cols):grid[0][j]+=grid[0][j-1]初始化第一列foriinrange(1,rows):grid[i][0]+=grid[i-1][0]动态规划填充矩阵foriinrange(1,rows):forjinrange(1,cols):grid[i][j]+=min(grid[i-1][j],grid[i][j-1])returngrid[-1][-1]测试用例grid=[[1,3,1],[1,5,1],[4,2,1]]print(minPathSum(grid))#7(1→3→1→1→1)解析:1.动态规划是解决这类问题的常用方法2.初始化第一行和第一列的路径和3.对于其他位置,选择上方或左方的最小路径和加上当前值4.最终右下角的值就是最小路径和时间复杂度:O(m×n),空间复杂度:O(1)(在原矩阵上修改)题目10(数据结构题,15分)实现一个LRU(最近最少使用)缓存。要求:1.支持get和put操作2.get操作返回键对应的值,同时将该键标记为最近使用3.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=ListNode()self.tail=ListNode()self.head.next=self.tailself.tail.prev=self.headdef_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_move_to_head(self,node):将节点移动到头部self._remove_node(node)self._add_node(node)def_pop_tail(self):弹出尾部节点res=self.tail.prevself._remove_node(res)returnresdefget(self,key:int)->int:node=self.cache.get(key,None)ifnotnode:return-1将访问的节点移动到头部self._move_to_head(node)returnnode.valuedefput(self,key:int,value:int)->None:node=self.cache.get(key)ifnode:更新值并移动到头部node.value=valueself._move_to_head(node)else:创建新节点new_node=ListNode(key,value)self.cache[key]=new_nodeself._add_node(new_node)如果超出容量,移除尾部节点iflen(s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 邯郸市永年区公开招聘警务辅助人员20人备考题库带答案详解
- 2025年广州市民政局直属事业单位第一次公开招聘工作人员25人备考题库附答案详解
- 2025年滁州市公安机关公开招聘警务辅助人员50人备考题库附答案详解
- 2025年中国光大银行光大理财社会招聘备考题库及答案详解一套
- 乐山市民政局2025年直属事业单位第二批次公开考核招聘工作人员备考题库附答案详解
- 2025年监狱戒毒系统招聘475人备考题库完整答案详解
- 2025年安吉辅警招聘真题及答案
- 2025年及未来5年市场数据中国三元乙丙橡胶行业发展潜力分析及投资方向研究报告
- 2025怡安人力资本研究
- 佛山市高明区公益一类医疗卫生事业单位招聘笔试真题2024
- 供应链管理在制造业供应链协同中的创新与实践报告
- 胎膜早破的诊断与处理指南
- 2025年药店岗前培训试题(含答案)
- 贵州国企招聘:2025贵州凉都能源有限责任公司招聘10人备考题库含答案详解(综合题)
- 被压迫者的教育学
- 污水池内壁防腐作业施工方案
- xx公司混凝土质量控制培训课件-完整版
- 2025年科研伦理与学术规范期末考试试题及参考答案
- 小学语文课程标准修订要点梳理
- 2025年公务员多省联考《申论》题(湖南行政执法卷)及参考答案
- 2026年1月福建省普通高中学业水平合格性考试政治仿真模拟卷03(春季高考适用)(全解全析)
评论
0/150
提交评论