软件工程师技术面试题及解答指南_第1页
软件工程师技术面试题及解答指南_第2页
软件工程师技术面试题及解答指南_第3页
软件工程师技术面试题及解答指南_第4页
软件工程师技术面试题及解答指南_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

2026年软件工程师技术面试题及解答指南一、编程语言基础(3题,每题10分,共30分)题目1:请用Python编写一个函数,接收一个字符串列表,返回其中所有包含重复字符的字符串。例如,输入`["abc","aab","xyz","aabb"]`,输出`["aab","aabb"]`。要求不使用额外的库函数,时间复杂度尽可能低。题目2:在Java中,编写一个方法,接收一个整数数组,返回一个新数组,其中包含原数组中所有奇数的平方。例如,输入`[1,2,3,4,5]`,输出`[1,9,25]`。要求原地修改数组时,不使用额外的数组空间。题目3:用C++实现一个类`UniqueVector`,继承自`std::vector`,并重写`push_back`方法,确保插入的元素在向量中唯一(即不允许重复)。如果尝试插入重复元素,则不添加并返回`false`,否则添加并返回`true`。要求使用标准库,不使用第三方库。二、数据结构与算法(4题,每题15分,共60分)题目4:设计一个LRU(最近最少使用)缓存,容量为`capacity`。支持`get(key)`和`put(key,value)`操作。要求使用双向链表和哈希表实现,`get`和`put`操作的时间复杂度为O(1)。题目5:给定一个整数数组,返回所有和为`target`的三个不同索引的组合。例如,输入`[2,7,11,15,-2]`,`target=9`,输出`[[0,1,2],[2,3,4]]`。要求不使用重复的组合,可以假设数组中元素唯一。题目6:编写一个函数,判断一个二叉树是否是平衡二叉树(即任意节点的左右子树高度差不超过1)。要求使用后序遍历实现,时间复杂度为O(n)。题目7:实现一个字符串的子串搜索算法,要求不使用KMP或Boyer-Moore算法,而是手动实现朴素算法。例如,输入`text="ABCDABCDABDE"`,`pattern="ABCDABD"`,输出`6`(子串从第6个字符开始匹配)。三、系统设计与架构(3题,每题20分,共60分)题目8:设计一个简单的短链接服务(如`t.co`)。要求支持:1.将长URL转换为短URL,短URL长度不超过6位。2.通过短URL快速解析回原始长URL。3.考虑高并发场景下的性能和可用性,简述主要技术选型(如数据库、缓存、负载均衡)。题目9:设计一个消息队列系统(如Kafka的简化版),要求支持:1.生产者发送消息,消费者拉取消息。2.消息持久化到磁盘,防止数据丢失。3.实现至少一次传递(at-least-oncedelivery)的机制。简述如何避免重复消费。题目10:设计一个高并发的秒杀系统,要求:1.支持高并发请求(如每秒10万+)。2.防止超卖和重复购买。3.简述数据库选型、缓存策略和限流方案。四、数据库与存储(2题,每题25分,共50分)题目11:设计一个电商订单表`orders`,要求:1.包含`id`(主键)、`user_id`、`product_id`、`price`、`status`(如待支付、已支付)、`create_time`。2.`status`字段需要支持快速查询(如统计“已支付”订单数量)。3.说明如何优化查询性能(如索引设计、分区策略)。题目12:假设你需要存储大量的用户行为日志(如点击、浏览),设计一个合适的存储方案:1.选择合适的数据库类型(关系型、NoSQL或混合)。2.说明数据模型设计(如表结构或文档结构)。3.如何应对数据量增长带来的挑战(如分表、分库)。五、网络与安全(2题,每题25分,共50分)题目13:解释HTTP/2与HTTP/1.1的主要区别,并说明为什么HTTP/2能提升网站性能。要求结合TCP连接、头部压缩、多路复用等概念。题目14:设计一个防止SQL注入的方案,要求:1.说明常见的SQL注入攻击方式。2.如何通过参数化查询或ORM框架防御。3.简述其他安全措施(如WAF、权限控制)。答案与解析一、编程语言基础题目1:pythondeffind_duplicates(strings):seen=set()duplicates=[]forsinstrings:ifany(cinseenforcins):duplicates.append(s)forcins:seen.add(c)returnduplicates解析:-使用集合`seen`记录已遍历的字符,遍历每个字符串时检查是否有重复字符。-时间复杂度O(NM),N为字符串数量,M为字符串最大长度。可优化为哈希表记录字符频率,但题目要求不使用库函数。题目2:javapublicstaticint[]squareOdds(int[]arr){intn=0;for(intnum:arr){if(num%2!=0){arr[n++]=numnum;}}returnArrays.copyOf(arr,n);}解析:-先统计奇数数量`n`,然后原地修改数组,最后复制前`n`个元素。避免使用额外数组空间。题目3:cppinclude<vector>include<unordered_set>classUniqueVector:publicstd::vector<int>{public:boolpush_back(intvalue)override{if(std::find(this->begin(),this->end(),value)!=this->end()){returnfalse;}std::vector<int>::push_back(value);returntrue;}};解析:-重写`push_back`,使用`std::find`检查元素是否已存在。注意`std::find`的时间复杂度为O(n),可进一步优化为哈希表。二、数据结构与算法题目4:cppclassLRUCache{private:structNode{intkey,value;Nodeprev,next;Node(intk,intv):key(k),value(v),prev(nullptr),next(nullptr){}};unordered_map<int,Node>cache;Nodehead=newNode(0,0),tail=newNode(0,0);intcapacity;public:LRUCache(intc):capacity(c){head->next=tail;tail->prev=head;}intget(intkey){autoit=cache.find(key);if(it==cache.end())return-1;Nodenode=it->second;moveToHead(node);returnnode->value;}voidput(intkey,intvalue){autoit=cache.find(key);if(it!=cache.end()){Nodenode=it->second;node->value=value;moveToHead(node);}else{if(cache.size()==capacity){removeTail();}NodenewNode=newNode(key,value);cache[key]=newNode;addToHead(newNode);}}voidmoveToHead(Nodenode){removeNode(node);addToHead(node);}voidaddToHead(Nodenode){node->next=head->next;node->prev=head;head->next->prev=node;head->next=node;}voidremoveNode(Nodenode){node->prev->next=node->next;node->next->prev=node->prev;}voidremoveTail(){NodetailPrev=tail->prev;removeNode(tailPrev);cache.erase(tailPrev->key);deletetailPrev;}};解析:-使用双向链表维护LRU顺序,哈希表记录键值对,确保O(1)操作。`moveToHead`表示节点被访问,`removeTail`用于淘汰最久未使用节点。题目5:pythondefthree_sum(nums,target):nums.sort()result=[]n=len(nums)foriinrange(n-2):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==target:result.append([i,left,right])whileleft<rightandnums[left]==nums[left+1]:left+=1whileleft<rightandnums[right]==nums[right-1]:right-=1left+=1right-=1eliftotal<target:left+=1else:right-=1returnresult解析:-排序后使用双指针,避免重复组合。跳过重复值以减少无效计算。题目6:javaclassTreeNode{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)return-1;if(Math.abs(leftHeight-rightHeight)>1)return-1;returnMath.max(leftHeight,rightHeight)+1;}解析:-后序遍历检查每个节点的左右子树高度差,若不平衡返回-1。整体时间复杂度O(n)。题目7:pythondefnaive_substring_search(text,pattern):n,m=len(text),len(pattern)foriinrange(n-m+1):match=Trueforjinrange(m):iftext[i+j]!=pattern[j]:match=Falsebreakifmatch:returnireturn-1解析:-暴力匹配,遍历文本中所有可能的起始位置,检查是否匹配模式。时间复杂度O(nm)。三、系统设计与架构题目8:设计短链接服务:1.URL转换:-使用哈希函数(如MD5)将长URL生成固定长度的短码(如`base62`编码)。-例如,`MD5("")`→`5f4dcc3b5aa765d61d8327deb882cf99`→`http://t.co/abc123`。2.数据库设计:-表结构:`id`(自增),`short_code`(唯一,如6位字母数字组合),`long_url`(文本)。-索引:`short_code`为主键索引。3.缓存:-使用Redis缓存热点短链接,减少数据库查询。4.高并发:-负载均衡分发请求,数据库读写分离。-限流措施(如令牌桶算法)防止服务过载。题目9:消息队列设计:1.生产者-消费者模型:-生产者将消息追加到持久化队列(如RocksDB或LevelDB)。-消费者拉取消息,确认消费后删除。2.至少一次传递:-消息持久化到磁盘,即使服务崩溃也能恢复。-消费者使用幂等性设计(如记录已消费消息ID)。3.避免重复消费:-发送方添加唯一消息ID,消费方记录ID防止重试。-状态机控制消息状态(待消费/已消费)。题目10:秒杀系统设计:1.数据库选型:-使用MySQL+Redis缓存。Redis存储用户秒杀状态。2.防超卖:-使用数据库事务+行锁(如`SELECT...FORUPDATE`)锁定库存。3.限流:-令牌桶算法限流,分布式锁防止并发写入。-预热技术(如提前加载商品信息到内存)。四、数据库与存储题目11:电商订单表设计:1.表结构:sqlCREATETABLEorders(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINT,product_idBIGINT,priceDECIMAL(10,2),statusENUM('pending','paid','shipped')NOTNULL,create_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP);2.索引优化:-`status`字段加索引:`INDEX(status)`。-联合索引:`INDEX(user_id,status)`(用于统计用户待支付订单)。3.分区策略:-按时间分区(如按月分区),提高查询性能。题目12:用户行为日志存储:1.

温馨提示

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

最新文档

评论

0/150

提交评论