版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年百度技术岗面试专业素养与项目经验类问题一、编程与算法基础(共5题,每题8分,总计40分)1.(8分)题目:给定一个非空整数数组,返回所有和为给定目标值的三元组。注意:三元组内的数字可以重复,但三元组本身不能重复。例如,给定数组`[1,2,3,4,5]`,目标值`9`,返回`[1,2,6]`(注意:`[2,3,4]`也是有效的,但题目要求不重复的三元组)。请写出Python代码实现,并说明时间复杂度。答案与解析:答案:pythondefthree_sum(nums,target):nums.sort()n=len(nums)result=[]foriinrange(n):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==target:result.append([nums[i],nums[left],nums[right]])whileleft<rightandnums[left]==nums[left+1]:left+=1whileleft<rightandnums[right]==nums[right-1]:right-=1left+=1right-=1eliftotal<target:left+=1else:right-=1returnresult示例print(three_sum([1,2,3,4,5],9))#输出[[1,2,6],[2,3,4]]解析:1.首先对数组进行排序,排序后方便使用双指针法。2.使用外层循环固定第一个数字,然后使用双指针`left`和`right`分别指向剩余部分的首尾。3.若三数之和等于目标值,则记录该三元组,并移动指针以避免重复。4.若三数之和小于目标值,则左指针右移;若大于目标值,则右指针左移。5.时间复杂度为`O(n²)`,排序`O(nlogn)`,双指针部分为`O(n²)`。2.(8分)题目:实现一个LRU(最近最少使用)缓存机制。LRU缓存会按照使用频率来淘汰最久未使用的项。请用Python实现,支持`get`和`put`操作,并说明你的数据结构和时间复杂度。答案与解析:答案: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)#去除键2print(lru.get(2))#返回-1解析:1.使用字典`cache`存储键值对,列表`order`记录访问顺序。2.`get`操作时,若键存在则将其移到`order`末尾(表示最近使用)。3.`put`操作时,若键已存在则更新值并调整顺序;若键不存在且已满,则删除最久未使用的项(`order`首部)。4.时间复杂度为`O(1)`,因为字典和列表操作均可在常数时间内完成。3.(8分)题目:给定一个字符串`s`,找到其中最长的回文子串。例如,`s="babad"`,最长回文子串为`"bab"`或`"aba"`。请写出代码并说明时间复杂度。答案与解析:答案:pythondeflongest_palindrome(s:str)->str:ifnots:return""start,end=0,0foriinrange(len(s)):len1=expand_from_center(s,i,i)#奇数长度len2=expand_from_center(s,i,i+1)#偶数长度max_len=max(len1,len2)ifmax_len>end-start:start=i-(max_len-1)//2end=i+max_len//2returns[start:end+1]defexpand_from_center(s:str,left:int,right:int)->int:whileleft>=0andright<len(s)ands[left]==s[right]:left-=1right+=1returnright-left-1示例print(longest_palindrome("babad"))#输出"bab"或"aba"解析:1.使用中心扩展法,遍历每个字符作为回文中心,分别尝试奇数和偶数长度。2.若当前回文长度大于记录的最大长度,则更新起始和结束索引。3.时间复杂度为`O(n²)`,因为每个中心最多扩展`n`次。4.(8分)题目:设计一个算法,找出数组中不重复的数字,且数组中只有一个数字只出现一次,其余数字均出现三次。例如,给定`[2,2,3,2]`,返回`3`。请写出代码并说明时间复杂度。答案与解析:答案:pythondefsingle_number(nums):a=b=0fornuminnums:a=(a^num)&~bb=(b^num)&~areturna示例print(single_number([2,2,3,2]))#输出3解析:1.使用两个变量`a`和`b`分别表示只出现一次的数字的低32位和`a`与`b`的差值。2.对于每个数字`num`,更新`a`和`b`:-`a`为`a`与`num`的异或,再与`~b`(即`b`的补码)取与。-`b`为`b`与`num`的异或,再与`~a`取与。3.最终`a`中存储只出现一次的数字。4.时间复杂度为`O(n)`,空间复杂度为`O(1)`。5.(8分)题目:给定一个包含`n`个整数的数组`nums`,判断数组中是否存在三个元素`a`,`b`,`c`,使得`a+b+c=0`。找出所有不重复的三元组。例如,`nums=[-1,0,1,2,-1,-4]`,返回`[-1,-1,2]`和`[-1,0,1]`。请写出代码并说明时间复杂度。答案与解析:答案:pythondefthree_sum(nums):nums.sort()n=len(nums)result=[]foriinrange(n):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==0:result.append([nums[i],nums[left],nums[right]])whileleft<rightandnums[left]==nums[left+1]:left+=1whileleft<rightandnums[right]==nums[right-1]:right-=1left+=1right-=1eliftotal<0:left+=1else:right-=1returnresult示例print(three_sum([-1,0,1,2,-1,-4]))#输出[[-1,-1,2],[-1,0,1]]解析:1.首先排序数组,方便使用双指针法。2.遍历数组,对于每个`nums[i]`,使用双指针`left`和`right`查找`nums[left]+nums[right]=-nums[i]`。3.若三数之和等于`0`,则记录三元组,并移动指针避免重复。4.时间复杂度为`O(n²)`,排序`O(nlogn)`,双指针部分为`O(n²)`。二、系统设计(共4题,每题10分,总计40分)1.(10分)题目:设计一个简单的URL缓存系统,要求支持以下功能:-`get(url)`:获取缓存中的URL对应的内容,若不存在则返回空字符串。-`put(url,content)`:将URL和内容存入缓存,若缓存已满则淘汰最久未使用的URL。缓存容量固定为`100`。请说明你的数据结构和实现思路。答案与解析:答案:可以使用`LRUCache`类实现,结合哈希表和双向链表:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.order=collections.OrderedDict()defget(self,url:str)->str:ifurlinself.cache:self.order.move_to_end(url)returnself.cache[url]return""defput(self,url:str,content:str)->None:ifurlinself.cache:self.order.move_to_end(url)eliflen(self.cache)>=self.capacity:oldest=self.order.popitem(last=False)delself.cache[oldest[0]]self.cache[url]=contentself.order[url]=content示例lru=LRUCache(100)lru.put("","Hello")print(lru.get(""))#返回"Hello"lru.put("","World")解析:1.使用`OrderedDict`维护URL的访问顺序,`cache`字典存储URL和内容。2.`get`操作时,若URL存在则将其移到末尾表示最近使用。3.`put`操作时,若URL已存在则更新内容并调整顺序;若已满则删除最久未使用的项(`OrderedDict`的首部)。4.时间复杂度为`O(1)`。2.(10分)题目:设计一个分布式计数器服务,支持高并发场景下的计数操作。要求:-支持多个客户端同时调用`increment(key)`方法,并保证计数准确。-支持异步获取计数器的值。请说明你的设计思路和实现方案。答案与解析:答案:可以使用Redis的`INCR`命令实现分布式计数器,具体步骤如下:1.每个客户端向Redis发送`INCRkey`命令,Redis会原子性地递增`key`的值并返回新的值。2.使用Lua脚本确保计数的一致性(可选,用于更复杂的计数逻辑)。3.异步获取计数器值时,可以直接读取Redis中的值。示例代码(客户端伪代码):pythondefincrement(key):returnredis.incr(key)defget_count(key):returnredis.get(key)解析:1.Redis的`INCR`命令是原子操作,确保高并发下的计数准确性。2.使用Lua脚本可以进一步保证复杂逻辑的一致性。3.时间复杂度为`O(1)`,因为Redis操作非常快。3.(10分)题目:设计一个简单的消息队列系统,要求:-支持生产者`push(message)`添加消息到队列。-支持消费者`pop()`获取并删除队列中的消息。-队列容量固定为`1000`,超出时阻塞生产者。请说明你的数据结构和实现思路。答案与解析:答案:可以使用循环队列实现:pythonclassMessageQueue:def__init__(self,capacity:int):self.capacity=capacityself.queue=[None]capacityself.head=0self.tail=0self.size=0defpush(self,message):ifself.size==self.capacity:raiseException("Queuefull")self.queue[self.tail]=messageself.tail=(self.tail+1)%self.capacityself.size+=1defpop(self):ifself.size==0:raiseException("Queueempty")message=self.queue[self.head]self.queue[self.head]=Noneself.head=(self.head+1)%self.capacityself.size-=1returnmessage示例mq=MessageQueue(1000)mq.push("Hello")print(mq.pop())#返回"Hello"解析:1.使用固定大小的数组`queue`和头尾指针`head`、`tail`实现循环队列。2.`push`时,若队列已满则阻塞;`pop`时,若队列为空则阻塞。3.时间复杂度为`O(1)`。4.(10分)题目:设计一个简单的分布式锁服务,要求:-支持多个客户端获取锁,且同一时间只能有一个客户端持有锁。-支持锁超时机制(例如,10秒超时)。-支持锁释放操作。请说明你的设计思路和实现方案。答案与解析:答案:可以使用Redis的`SETNX`和`EXPIRE`命令实现分布式锁:1.客户端向Redis发送`SETNXkeyvalueNXPXmilliseconds`命令,若键不存在则设置键并设置过期时间。2.若成功则持有锁,否则等待或超时。3.释放锁时,先确认是否是持有者,然后删除键。示例代码(客户端伪代码):pythondefacquire_lock(key,timeout):whileTrue:result=redis.setnx(key,"locked")ifresult:redis.expire(key,timeout)returnTruetime.sleep(0.1)#等待或超时defrelease_lock(key):redis.del(key)解析:1.`SETNX`确保原子性,`NX`表示键不存在时才设置,`PX`设置过期时间。2.若成功则持有锁,否则等待或超时。3.释放锁时需确认是否是持有者,避免误删。三、项目经验(共4题,每题10分,总计40分)1.(10分)题目:你在之前的实习项目中,负责优化一个电商平台的商品推荐系统。请描述:-项目背景和目标是什么?-你采取了哪些优化措施?-最终效果如何(例如,点击率提升了多少)?答案与解析:答案:1.项目背景和目标:-背景:电商平台推荐系统基于协同过滤,但用户点击率较低。-目标:提升推荐准确性和用户点击率。2.优化措施:-增加用户行为特征(如浏览时长、购买历史)。-引入深度学习模型(如DNN),提升推荐精度。-使用实时数据处理(如Kafka+Flink),加快推荐速度。3.最终效果:-点击率从`5%`提升至`
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 漯河市辅警招聘笔试题及答案
- 喉角化不全症护理查房
- 徐家汇租房合同
- 2026年国企内部遴选工作人员笔试试题及答案解析
- 盐池中学2025-2026学年高一下学期期中考试生物 试卷
- 成人白内障手术操作规范总结2026
- 《结构设计原理》课件-无锡高架桥侧翻事故
- 2026年二年级乘除法入门
- 预算管理办法
- 展架代理销售合作合同协议书
- 2026云南玉溪通海县供销合作社社有企业招聘4人考试参考题库及答案解析
- 五月志愿服务课件:青春建功新时代 志愿奉献谱华章
- 堆与堆排序课件
- 破碎岩石施工方案(3篇)
- GB/T 17889.7-2026梯子第7部分:可分离式平台梯
- 中国电气装备集团笔试内容
- 中国遗传咨询指南(2025版)
- 深度解析(2026)《NBT 10096-2018电力建设工程施工安全管理导则》
- 2026春译林8下单词表【Unit1-8】(可编辑版)
- 2026年全国硕士研究生招生考试英语(一)试题 附答案
- 建筑工程进场材料、构配件和设备质量控制工作标准
评论
0/150
提交评论