后端开发工程师面试题含答案_第1页
后端开发工程师面试题含答案_第2页
后端开发工程师面试题含答案_第3页
后端开发工程师面试题含答案_第4页
后端开发工程师面试题含答案_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

2026年后端开发工程师面试题含答案一、编程基础与算法(15分,共3题)1.题目(5分):请实现一个函数,输入一个非负整数`n`,返回`n`的二进制表示中`1`的个数。例如,输入`11`(二进制为`1011`),返回`3`。答案:pythondefcount_bits(n):count=0whilen:count+=n&1n>>=1returncount示例print(count_bits(11))#输出3解析:该方法通过位运算实现。每次将`n`右移一位,并与`1`进行按位与操作,若结果为`1`则计数器加一。直到`n`为`0`时结束。时间复杂度为O(logn)。2.题目(5分):给定一个排序数组,例如`[1,2,4,4,5,6,8]`,其中`4`出现两次。请设计一个算法,找出`4`的第一个和最后一个出现的位置。答案:pythondeffind_range(nums,target):deffind_left(nums,target):left,right=0,len(nums)-1whileleft<=right:mid=(left+right)//2ifnums[mid]<target:left=mid+1else:right=mid-1returnleftdeffind_right(nums,target):left,right=0,len(nums)-1whileleft<=right:mid=(left+right)//2ifnums[mid]<=target:left=mid+1else:right=mid-1returnrightleft=find_left(nums,target)right=find_right(nums,target)ifleft<=right:return[left,right]else:return[-1,-1]示例print(find_range([1,2,4,4,5,6,8],4))#输出[2,3]解析:利用二分查找分别查找左边界和右边界。左边界通过`nums[mid]<target`收缩右边界,右边界通过`nums[mid]<=target`收缩左边界。最终返回`[left,right]`,若无匹配则返回`[-1,-1]`。3.题目(5分):请实现一个LRU(LeastRecentlyUsed)缓存,支持`get`和`put`操作。缓存容量为`capacity`。例如:-`LRU([1,2],2)`:-`get(1)`返回`1`(最近使用`1`)-`put(3,3)`缓存满,删除`2`,缓存为`{1:1,3:3}`-`get(2)`返回`-1`(未命中)答案:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.order=[]defget(self,key:int)->int:ifkeyinself.cache:self.order.remove(key)self.order.append(key)returnself.cache[key]return-1defput(self,key:int,value:int)->None:ifkeyinself.cache:self.order.remove(key)eliflen(self.cache)==self.capacity:oldest=self.order.pop(0)delself.cache[oldest]self.cache[key]=valueself.order.append(key)示例lru=LRUCache(2)lru.put(1,1)lru.put(2,2)print(lru.get(1))#返回1lru.put(3,3)#删除key2print(lru.get(2))#返回-1解析:使用字典`cache`存储键值对,列表`order`记录访问顺序。`get`操作将键移至末尾表示最近使用,`put`操作先检查键是否存在,若存在则更新顺序,若缓存满则删除最久未使用的键(列表头部)。二、数据库与SQL(20分,共4题)1.题目(5分):假设有一个`orders`表:sqlCREATETABLEorders(idINTPRIMARYKEY,customer_idINT,order_dateDATE,total_amountDECIMAL(10,2));请写出SQL查询,找出每个客户的总订单金额,并按金额降序排列。答案:sqlSELECTcustomer_id,SUM(total_amount)AStotal_spentFROMordersGROUPBYcustomer_idORDERBYtotal_spentDESC;解析:使用`SUM()`对`total_amount`汇总,`GROUPBY`按客户分组,`ORDERBY`降序排列。2.题目(5分):假设有一个`employees`表:sqlCREATETABLEemployees(idINTPRIMARYKEY,nameVARCHAR(50),departmentVARCHAR(50),salaryDECIMAL(10,2));请写出SQL查询,找出每个部门平均工资最低的员工姓名和部门。答案:sqlSELECT,e.departmentFROMemployeeseINNERJOIN(SELECTdepartment,MIN(avg_salary)ASmin_avg_salaryFROM(SELECTdepartment,AVG(salary)ASavg_salaryFROMemployeesGROUPBYdepartment)ASsubGROUPBYdepartment)ASsub2ONe.department=sub2.departmentANDe.salary=sub2.avg_salary;解析:嵌套查询:1.子查询`sub`计算每个部门的平均工资。2.子查询`sub2`找出每个部门的最低平均工资。3.主查询连接`employees`表,筛选出对应最低平均工资的员工。3.题目(5分):假设有一个`products`表:sqlCREATETABLEproducts(idINTPRIMARYKEY,nameVARCHAR(50),priceDECIMAL(10,2),categoryVARCHAR(50));请写出SQL查询,找出每个类别的最贵产品名称和价格。答案:sqlSELECTcategory,name,priceFROMproductsWHERE(category,price)IN(SELECTcategory,MAX(price)FROMproductsGROUPBYcategory);解析:使用子查询先按`category`分组并取`MAX(price)`,然后主查询筛选出对应最贵产品的记录。4.题目(5分):假设有一个`logs`表:sqlCREATETABLElogs(idINTPRIMARYKEY,user_idINT,actionVARCHAR(50),timestampDATETIME);请写出SQL查询,找出每个用户最近一次操作的记录。答案:sqlSELECTuser_id,action,timestampFROMlogsWHERE(user_id,timestamp)IN(SELECTuser_id,MAX(timestamp)FROMlogsGROUPBYuser_id);解析:与上一题类似,子查询按`user_id`分组并取`MAX(timestamp)`,主查询筛选出对应最新操作的记录。三、系统设计与架构(35分,共5题)1.题目(7分):设计一个高并发的短链接生成系统。要求:-链接长度尽可能短(如`/abcde`)。-高可用、可扩展。答案:1.编码方式:使用Base62(字母+数字,如`a-z`,`A-Z`,`0-9`),将长URL转换为短ID(如`12345`→`abcde`)。2.存储:-使用Redis存储短ID与长URL的映射,支持高并发`GET`/`SET`。-分布式部署Redis(如Sentinel或Cluster)。3.路由:-Nginx负责负载均衡,将短链接请求转发到后端服务。-后端服务查询Redis并返回长URL。4.扩展性:-使用分片(Sharding)将短ID分配到不同Redis实例。-水平扩展后端服务(如Kubernetes)。解析:Base62编码压缩ID,Redis高并发读写,Nginx负载均衡,分片和K8s支持水平扩展。2.题目(7分):设计一个高并发的秒杀系统。要求:-每秒处理大量请求,防止超卖。-分布式锁或原子操作保证库存一致。答案:1.请求分发:Nginx热点分流,限制单IP频率。2.库存存储:Redis使用`INCR`原子递减库存,超卖时返回`0`。3.分布式锁:-使用Redis`SETNX`实现锁(如`SETNXlock_key10NX`)。-超时机制(`EXPIRE`)防止死锁。4.幂等性:检查订单状态(未支付则取消)。5.异步通知:消息队列(如Kafka)通知风控系统。解析:Redis原子操作防超卖,分布式锁保证互斥,异步处理提高吞吐。3.题目(7分):设计一个实时推荐系统(如淘宝商品推荐)。要求:-支持UV/UV价值计算,动态调整权重。-低延迟查询。答案:1.数据存储:-用户行为日志存入Kafka,实时计算UV/UV价值。-推荐结果存入Redis(Hash结构,如`user:12345`→`{item_id:weight}`)。2.计算逻辑:-使用FPD(Frequency-Power-Density)算法计算权重。-用户实时特征存入Elasticsearch,动态调整推荐。3.查询优化:-缓存热门推荐(如`hot_items`)。-使用布隆过滤器(BloomFilter)快速过滤无效推荐。解析:Kafka+Redis存储实时数据,FPD算法动态权重,Elasticsearch支持低延迟查询。4.题目(7分):设计一个分布式事务系统(如跨库支付)。要求:-支持TCC(Try-Confirm-Cancel)模式。-保证一致性。答案:1.中间件:使用Seata或DubboTCC实现分布式事务。2.流程设计:-`Try`阶段:锁定资源(如扣款冻结)。-`Confirm`阶段:执行业务操作(扣款、放款)。-`Cancel`阶段:回滚操作(解冻资金)。3.可靠性:-使用消息队列(如RocketMQ)保证指令可靠传递。-超时重试或人工补偿。解析:TCC模式分阶段控制,消息队列保证指令可靠,中间件简化实现。5.题目(7分):设计一个高可用、可扩展的短URL系统架构。要求:-支持百万级并发。-链接持久化到数据库。答案:1.分层架构:-接入层:Nginx负载均衡,CDN缓存热点链接。-服务层:多实例部署(如SpringCloud),使用Redis缓存热点数据。-存储层:MySQL分库分表(按短ID哈希),支持高并发写入。2.数据一致性:-使用MySQL事务保证短ID与长URL关联。-Redis持续同步MySQL数据。3.可扩展性:-微服务拆分(如生成服务、查询服务)。-使用Docker+K8s实现弹性伸缩。解析:Nginx+CDN分担流量,Redis+MySQL存储数据,微服务+K8s支持扩展。四、Java/Go/Python编程(30分,共4题)1.题目(7分):Java中如何实现线程安全的单例模式?答案:javapublicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();}}}returninstance;}}解析:双重校验锁(Double-CheckedLocking)+`volatile`防止指令重排,确保单例唯一。2.题题(7分):Go中如何实现高并发的计数器?答案:gopackagemainimport("sync""sync/atomic")varcounterint64varmusync.MutexfuncIncr(){atomic.AddInt64(&counter,1)}funcmain(){fori:=0;i<1000;i++{goIncr()}//等待所有协程完成wg:=sync.WaitGroup{}wg.Add(1000)fori:=0;i<1000;i++{gofunc(){deferwg.Done()Incr()}()}wg.Wait()println(counter)}解析:使用`atomic.AddInt64`原子操作,避免锁竞争,提升性能。3.题目(7分):Python中如何优雅地处理异步任务?答案:pythonimportasyncioasyncdeffetch(url):print(f"Fetching{url}")awaitasyncio.sleep(1)#模拟网络请求returnf"Datafrom{url}"asyncdefmain():tasks=[fetch(""),fetch("")]results=awaitasyncio.gather(tasks)print(results)asyncio.run(main())解析:使用`asyncio`模块,`async`函数和`await`调用,`gather`并发执行任务。4.题目(7分):Java中如何实现自定义注解?答案:javaimportjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@interfaceMyAnnotation{Stringvalue()default"default";}@MyAnnotation("custom")classMyClass{publicvoidmethod(){System.out.println("Hello");}}publicclassAnnotationDemo{publicstaticvoidmain(String[]args){MyAnnotationannotation=MyClass.class.getAnnotation(MyAnnotation.class);System.o

温馨提示

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

评论

0/150

提交评论