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

下载本文档

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

文档简介

2026年软件工程师面试技术题库一、编程语言基础(5题,每题10分,共50分)1.题目请用Java实现一个方法,接收一个整数数组,返回该数组中的最大值。要求:①不使用Java自带的max方法②考虑数组可能为空的情况③代码需包含异常处理2.题目用Python编写一个函数,实现以下功能:接收一个字符串,统计其中每个字符出现的次数,并以字典形式返回。例如:输入"hello",返回{'h':1,'e':1,'l':2,'o':1}。要求:①忽略大小写统计②处理空字符串情况③优化性能3.题目用C++实现一个类,包含以下功能:①构造函数接收一个整数,初始化成员变量②析构函数输出提示信息③重载"<<"运算符用于打印对象信息④包含一个静态成员变量记录创建对象数量4.题目用JavaScript实现一个闭包,创建一个计数器函数,要求:①每次调用返回当前计数②包含一个私有变量存储计数③提供重置功能5.题目用Go语言实现一个协程,模拟生产者-消费者模式。生产者每秒生成一个随机数,消费者接收并打印,要求:①使用channel通信②处理协程退出③展示goroutine使用二、数据结构与算法(8题,每题10分,共80分)1.题目设计一个算法,判断一个字符串是否是另一个字符串的子序列。例如:"abc"是"ahbgdc"的子序列。要求:①时间复杂度O(n)②空间复杂度O(1)2.题目实现二叉树的深度优先遍历(前序、中序、后序),要求:①递归和非递归两种方式实现②用Java或C++实现3.题目给定一个无重复元素的数组,找出所有可能的子集,要求:①不使用递归②用Python实现4.题目实现LRU(最近最少使用)缓存,要求:①容量固定②支持get和put操作③用Java实现,考虑并发场景5.题目用动态规划解决背包问题:给定物品价值和重量,以及背包容量,求最大总价值。要求:①时间复杂度O(nC)②用C++实现6.题目实现快速排序算法,要求:①时间复杂度分析②考虑最坏情况优化③用JavaScript实现7.题目设计一个算法,找出数组中重复次数超过一半的元素。要求:①时间复杂度O(n)②空间复杂度O(1)③用Python实现8.题目用链表实现一个栈,要求:①包含push、pop、peek操作②用C++实现三、系统设计与架构(5题,每题15分,共75分)1.题目设计一个高并发的短链接系统,要求:①支持分布式部署②提供实时统计功能③考虑缓存使用2.题目设计一个微博系统的核心模块:关注系统。要求:①支持关注/取关②实时消息推送③考虑数据一致性3.题目设计一个分布式任务调度系统,要求:①支持定时任务②任务失败重试③资源限制控制4.题目设计一个电商平台的订单系统,要求:①订单状态流转②支付异步通知③异常处理机制5.题目设计一个秒杀系统,要求:①防超卖②高并发处理③系统可用性保障四、数据库与存储(4题,每题15分,共60分)1.题目设计一个用户表,包含以下字段:用户ID、用户名、邮箱、手机号、注册时间。要求:①考虑索引设计②用SQL实现约束③用MySQL语法2.题目解释数据库事务的ACID特性,并举例说明每个特性在实际应用中的体现。要求:①用实际业务场景说明②考虑隔离级别3.题目设计一个商品推荐系统数据库表结构,要求:①考虑关联关系②包含用户行为数据③用PostgreSQL语法4.题目比较MySQL和PostgreSQL的优缺点,并说明在什么场景下选择哪个数据库。要求:①从性能、功能、生态角度分析②结合中国互联网环境五、网络与安全(4题,每题15分,共60分)1.题目解释TCP三次握手和四次挥手过程,并说明为什么不能采用两次握手。要求:①用状态图辅助说明②考虑数据包丢失场景2.题目设计一个防止SQL注入的方案,要求:①包含参数化查询②考虑XSS攻击防护③用Java实现示例3.题目解释HTTPS工作原理,包含哪些加密过程。要求:①说明证书作用②考虑中间人攻击防范4.题目设计一个分布式缓存方案,要求:①包含Redis和Memcached②考虑数据一致性③高可用部署答案与解析一、编程语言基础题目1答案(Java)javapublicintfindMax(int[]array){if(array==null||array.length==0){thrownewIllegalArgumentException("数组不能为空");}intmax=array[0];for(inti=1;i<array.length;i++){if(array[i]>max){max=array[i];}}returnmax;}解析:①首先检查数组是否为空或长度为0,抛出异常②从第二个元素开始遍历,与当前最大值比较③返回最大值,时间复杂度O(n),空间复杂度O(1)题目2答案(Python)pythondefcount_chars(s):ifnots:return{}count={}forcharins.lower():ifcharincount:count[char]+=1else:count[char]=1returncount解析:①忽略大小写用lower()处理②空字符串直接返回空字典③统计时用字典记录,时间复杂度O(n),空间复杂度O(k)(k为不同字符数)题目3答案(C++)cppinclude<iostream>include<string>classCounter{private:intvalue;staticintcreatedCount;public:Counter(intval):value(val){createdCount++;std::cout<<"对象创建,当前计数:"<<value<<std::endl;}~Counter(){std::cout<<"对象销毁,当前计数:"<<value<<std::endl;}friendstd::ostream&operator<<(std::ostream&os,constCounter&c){os<<"Counter:value="<<c.value;returnos;}staticintgetCreatedCount(){returncreatedCount;}};解析:①构造函数初始化成员变量②析构函数输出提示信息③重载<<运算符输出对象信息④静态成员变量记录创建数量题目4答案(JavaScript)javascriptfunctioncreateCounter(){letcount=0;return{increment:function(){count++;returncount;},reset:function(){count=0;}};}解析:①闭包创建私有变量count②increment方法增加计数③reset方法重置计数,实现私有变量保护题目5答案(Go)gopackagemainimport("fmt""sync""time")funcmain(){ch:=make(chanint)varwgsync.WaitGroup//生产者wg.Add(1)gofunc(){deferwg.Done()fori:=0;i<10;i++{ch<-itime.Sleep(time.Second)}}()//消费者wg.Add(1)gofunc(){deferwg.Done()fornum:=rangech{fmt.Println("收到:",num)}}()wg.Wait()}解析:①创建channel用于通信②生产者每秒发送一个数字③消费者接收并打印④使用WaitGroup确保协程完成二、数据结构与算法题目1答案(Python)pythondefis_subsequence(s,t):ifnots:returnTruepointer=0forcharint:ifchar==s[pointer]:pointer+=1ifpointer==len(s):returnTruereturnFalse解析:①指针法遍历t②匹配s中的字符③O(n)时间复杂度,O(1)空间复杂度题目2答案(Java)java//前序遍历-递归publicvoidpreorderTraversal(TreeNoderoot){if(root==null)return;System.out.print(root.val+"");preorderTraversal(root.left);preorderTraversal(root.right);}//中序遍历-非递归publicvoidinorderTraversal(TreeNoderoot){Stack<TreeNode>stack=newStack<>();TreeNodecurrent=root;while(current!=null||!stack.isEmpty()){while(current!=null){stack.push(current);current=current.left;}current=stack.pop();System.out.print(current.val+"");current=current.right;}}//后序遍历-非递归publicvoidpostorderTraversal(TreeNoderoot){if(root==null)return;Stack<TreeNode>stack1=newStack<>();Stack<TreeNode>stack2=newStack<>();stack1.push(root);while(!stack1.isEmpty()){TreeNodenode=stack1.pop();stack2.push(node);if(node.left!=null)stack1.push(node.left);if(node.right!=null)stack1.push(node.right);}while(!stack2.isEmpty()){System.out.print(stack2.pop().val+"");}}解析:①递归实现简单但栈溢出风险高②非递归需要模拟系统栈③后序遍历需要两个栈或Morris遍历优化题目3答案(Python)pythondefsubsets(nums):result=[]subset=[]defbacktrack(start):result.append(subset.copy())foriinrange(start,len(nums)):subset.append(nums[i])backtrack(i+1)subset.pop()backtrack(0)returnresult解析:①回溯算法框架②start参数避免重复使用元素③不使用递归,用栈模拟系统栈题目4答案(Java)javaimportjava.util.HashMap;importjava.util.Map;publicclassLRUCache<K,V>{privatefinalintcapacity;privatefinalMap<K,Node>cache;privatefinalNodehead,tail;classNode{Kkey;Vvalue;Nodeprev,next;}publicLRUCache(intcapacity){this.capacity=capacity;this.cache=newHashMap<>();head=newNode();tail=newNode();head.next=tail;tail.prev=head;}publicVget(Kkey){Nodenode=cache.get(key);if(node==null)returnnull;moveToHead(node);returnnode.value;}publicvoidput(Kkey,Vvalue){Nodenode=cache.get(key);if(node==null){NodenewNode=newNode();newNode.key=key;newNode.value=value;cache.put(key,newNode);addToHead(newNode);if(cache.size()>capacity){Nodelru=tail.prev;removeNode(lru);cache.remove(lru.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);}}解析:①双向链表+哈希表实现②get时移动到头部③put时检查容量,删除最久未使用节点③考虑并发用ConcurrentHashMap题目5答案(C++)cppinclude<vector>include<algorithm>usingnamespacestd;intknapsack(intW,vector<int>&weights,vector<int>&values){intn=weights.size();vector<vector<int>>dp(n+1,vector<int>(W+1,0));for(inti=1;i<=n;i++){for(intw=1;w<=W;w++){if(weights[i-1]<=w){dp[i][w]=max(dp[i-1][w],values[i-1]+dp[i-1][w-weights[i-1]]);}else{dp[i][w]=dp[i-1][w];}}}returndp[n][W];}解析:①动态规划定义dp[i][w]为前i件物品容量为w时的最大价值②递推公式③时间复杂度O(nW),空间复杂度O(nW)题目6答案(JavaScript)javascriptfunctionquickSort(arr){if(arr.length<=1)returnarr;constpivot=arr[0];constleft=[];constright=[];for(leti=1;i<arr.length;i++){if(arr[i]<pivot){left.push(arr[i]);}else{right.push(arr[i]);}}returnquickSort(left).concat(pivot,quickSort(right));}解析:①分治思想②基准选择第一个元素③时间复杂度O(nlogn)平均,O(n^2)最坏④可以优化为in-place题目7答案(Python)pythondefmajority_element(nums):count=0candidate=Nonefornuminnums:ifcount==0:candidate=numcount+=(1ifnum==candidateelse-1)returncandidate解析:①Boyer-Moore投票算法②多数元素出现次数超过n/2③时间复杂度O(n),空间复杂度O(1)题目8答案(C++)cppinclude<list>classLinkedStack{private:std::list<int>stack;public:voidpush(intvalue){stack.push_back(value);}intpop(){if(stack.empty()){throwstd::runtime_error("栈为空");}intvalue=stack.back();stack.pop_back();returnvalue;}intpeek(){if(stack.empty()){throwstd::runtime_error("栈为空");}returnstack.back();}boolempty(){returnstack.empty();}};解析:①std::list实现栈操作②push添加到尾部③pop和peek操作尾部元素④时间复杂度O(1)三、系统设计与架构题目1答案设计要点:1.分布式部署:使用一致性哈希算法分配短链接2.缓存设计:使用Redis缓存热点短链接3.数据库:使用分片数据库存储原始URL和短链接映射4.接口设计:RESTfulAPI提供短链接生成和访问5.安全设计:限制访问频率,防止暴力破解题目2答案设计要点:1.关注关系:使用多表设计存储关注关系2.实时推送:使用WebSocket或Server-SentEvents3.数据一致性:使用事务保证关注关系和消息队列的一致性4.缓存:使用Redis缓存关注关系5.性能优化:关注列表使用分页加载题目3答案设计要点:1.任务存储:使用Redis或Zookeeper存储任务信息2.调度器:使用分布式调度框架如Quartz3.重试机制:设置重试次数和间隔4.资源控制:使用限流器控制并发执行任务数5.监控:记录任务执行状态和耗时题目4答案设计要点:1.订单状态:使用状态机管理订单状态2.支付异步:使用消息队列处理支付回调3.异常处理:实现支付失败和超时的处理逻辑4.数据一致性:使用分布式事务或最终一致性方案5.高可用:订单服务需要水平扩展题目5答案设计要点:1.库存控制:使用分布式锁或原子操作控制库存2.接口设计:秒杀接口需要防缓存击穿3.异步处理:订单生成使用消息队列4.压力测试:系统需要能承受高并发压力5.容错设计:秒杀失败需要返回库存四、数据库与存储题目1答案sqlCREATETABLEusers(user_idBIGINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,emailVARCHAR(100)NOTNULLUNIQUE,phoneVARCHAR(20),registration_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,INDEXidx_username(username),INDEXidx_registration(registration_time))ENGINE=InnoDB;解析:①使用InnoDB引擎支持事务②唯一索引保证数据唯一③合适字段类型④索引设计提高查询效率题目2答案ACID特性:1.原子性:银行转账必须同时成功或失败2.一致性:订单金额变化前后必须满足业务规则3.隔离性:一个事务不应被其他事务干扰4.持久性:已提交事务必须永久保存隔离级别:1.READUNCOMMITTED:可能出现脏读2.READCOMMITTED:可避免脏读但可能出现不可重复读3.REPEATABLEREAD:MySQL默认,可避免脏读和不可重复读4.SERIALIZABLE:完全隔离,但性能最低题目3答案sqlCREATETABLEproducts(product_idBIGINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(100)NOTNULL,category_idBIGINT,priceDECIMAL(10,2)NOTNULL,descriptionTEXT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(category_id)REFERENCESproduct_categories(id),INDEXidx_category(category_id),FULLTEXTidx_name_description(name,description))ENGINE=InnoDB;解析:①关联分类表②价格使用DECIMAL类型③全文索引支持搜索④InnoDB支持事务题目4答案MySQLvsPostgreSQL比较:1.性能:-MySQL:读操作优化更好,适合读密集型-PostgreSQL:写操作和复杂查询更好2.功能:-MySQL:简单易用,存储过程支持较好-PostgreSQL:支持JSONB、窗口函数等高级特性3.生态:-MySQL:社区活跃,云服务完善-PostgreSQL:学术背景,企业支持强大4.中国场景:-MySQL:淘宝等老项目迁移多-PostgreSQL:新项目采用多,

温馨提示

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

最新文档

评论

0/150

提交评论