版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年互联网公司技术主管的面试要点及答案一、编程与算法(15题,共45分)1.(5分)题目:请实现一个函数,输入一个非负整数`n`,返回`n`的二进制表示中`1`的个数。例如,输入`5`,输出`2`(二进制为`101`)。答案:pythondefcount_bits(n):count=0whilen:count+=n&1n>>=1returncount解析:通过位运算`n&1`获取最低位是否为`1`,然后右移一位继续统计,直到`n`为`0`。时间复杂度为`O(logn)`。2.(5分)题目:给定一个字符串`s`,判断它是否是`有效的括号`(只包含`()`、`[]`、`{}`,且括号匹配)。答案:pythondefisValid(s):stack=[]mapping={')':'(',']':'[','}':'{'}forcharins:ifcharinmapping:ifnotstackorstack[-1]!=mapping[char]:returnFalsestack.pop()else:stack.append(char)returnnotstack解析:使用栈结构,遇到右括号时检查栈顶是否匹配,匹配则弹出,否则返回`False`。最后栈为空则有效。3.(5分)题目:设计一个`LRU(最近最少使用)缓存`,支持`get`和`put`操作。答案:pythonclassLRUCache:def__init__(self,capacity):self.capacity=capacityself.cache={}self.order=[]defget(self,key):ifkeyinself.cache:self.order.remove(key)self.order.append(key)returnself.cache[key]return-1defput(self,key,value):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)解析:使用字典存储键值对,列表维护使用顺序。`get`时移动到末尾,`put`时先检查是否超出容量,若超出则删除最久未使用的。4.(5分)题目:给定一个链表,反转链表并返回反转后的头节点。答案:pythondefreverseList(head):prev=Nonecurrent=headwhilecurrent:next_node=current.nextcurrent.next=prevprev=currentcurrent=next_nodereturnprev解析:使用三个指针`prev`、`current`、`next_node`逐个反转节点。时间复杂度为`O(n)`,空间复杂度为`O(1)`。5.(5分)题目:实现一个`二叉树的最大深度`计算。答案:pythondefmaxDepth(root):ifnotroot:return0return1+max(maxDepth(root.left),maxDepth(root.right))解析:递归计算左右子树的最大深度,加`1`为当前节点深度。时间复杂度为`O(n)`。6.(5分)题目:给定一个数组,找出其中和为`target`的两个数,返回它们的索引。答案:pythondeftwoSum(nums,target):mapping={}fori,numinenumerate(nums):complement=target-numifcomplementinmapping:return[mapping[complement],i]mapping[num]=i解析:使用哈希表记录已遍历的数字及其索引,时间复杂度为`O(n)`。7.(5分)题目:实现一个`合并两个排序链表`的函数。答案:pythondefmergeTwoLists(l1,l2):dummy=ListNode(0)current=dummywhilel1andl2:ifl1.val<l2.val:current.next=l1l1=l1.nextelse:current.next=l2l2=l2.nextcurrent=current.nextcurrent.next=l1orl2returndummy.next解析:使用虚拟头节点,逐个比较两个链表的节点,按顺序合并。8.(5分)题目:给定一个字符串,判断它是否是回文串。答案:pythondefisPalindrome(s):s=''.join(filter(str.isalnum,s)).lower()returns==s[::-1]解析:去除非字母数字字符并转为小写,然后比较字符串是否对称。9.(5分)题目:实现一个`LRU缓存`的`get`和`put`方法,使用`双向链表`和`哈希表`实现。答案:pythonclassDLinkedNode:def__init__(self,key=0,value=0):self.key=keyself.value=valueself.prev=Noneself.next=NoneclassLRUCache:def__init__(self,capacity):self.capacity=capacityself.cache={}self.head,self.tail=DLinkedNode(),DLinkedNode()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):node=self.cache.get(key,None)ifnotnode:return-1self._move_to_head(node)returnnode.valuedefput(self,key,value):node=self.cache.get(key)ifnotnode:newNode=DLinkedNode(key,value)self.cache[key]=newNodeself._add_node(newNode)iflen(self.cache)>self.capacity:tail=self._pop_tail()delself.cache[tail.key]else:node.value=valueself._move_to_head(node)解析:使用双向链表维护访问顺序,哈希表实现`O(1)`时间复杂度的查找。10.(5分)题目:给定一个非空数组,返回所有可能的全排列。答案:pythondefpermute(nums):res=[]used=[False]len(nums)defbacktrack(path):iflen(path)==len(nums):res.append(path[:])returnforiinrange(len(nums)):ifnotused[i]:used[i]=Truepath.append(nums[i])backtrack(path)path.pop()used[i]=Falsebacktrack([])returnres解析:回溯法生成所有排列,使用`used`数组记录已选择的元素。11.(5分)题目:实现一个`快速排序`算法。答案:pythondefquickSort(nums):iflen(nums)<=1:returnnumspivot=nums[len(nums)//2]left=[xforxinnumsifx<pivot]middle=[xforxinnumsifx==pivot]right=[xforxinnumsifx>pivot]returnquickSort(left)+middle+quickSort(right)解析:选择中间元素为枢轴,将数组分为三部分,递归排序左右部分。12.(5分)题目:实现一个`二叉搜索树`的`中序遍历`。答案:pythondefinorderTraversal(root):res=[]definorder(node):ifnode:inorder(node.left)res.append(node.val)inorder(node.right)inorder(root)returnres解析:递归遍历左子树、当前节点、右子树,时间复杂度为`O(n)`。13.(5分)题目:给定一个字符串,统计其中每个字符的出现次数。答案:pythonfromcollectionsimportdefaultdictdefcount_chars(s):counts=defaultdict(int)forcharins:counts[char]+=1returncounts解析:使用`defaultdict`统计字符频率,时间复杂度为`O(n)`。14.(5分)题目:实现一个`二叉树的前序遍历`。答案:pythondefpreorderTraversal(root):res=[]defpreorder(node):ifnode:res.append(node.val)preorder(node.left)preorder(node.right)preorder(root)returnres解析:递归遍历当前节点、左子树、右子树。15.(5分)题目:给定一个整数数组,返回其中`第三大的数`。如果有重复,返回最大的第三大数。答案:pythondefthirdMax(nums):first,second,third=float('-inf'),float('-inf'),float('-inf')fornuminnums:ifnum>first:first,second,third=num,first,secondeliffirst>num>second:second,third=num,secondelifsecond>num>third:third=numreturnthirdifthird!=float('-inf')elsefirst解析:维护三个变量记录前三大的数,遍历数组更新。二、系统设计(5题,共25分)16.(5分)题目:设计一个`URL短链接`服务,要求:1.支持将长链接转换为短链接;2.支持根据短链接反查长链接;3.高并发场景下响应时间低。答案:1.数据结构:-使用`哈希表`(Redis)存储`短链接<->长链接`对;-短链接可使用`随机生成6位Base62编码`(如`aV3zQ7`)。2.算法:-生成短链接时,随机生成`6位`字符,检查是否重复,重复则重试;-反查时,直接通过哈希表`O(1)`查询。3.高并发:-使用`Redis`高性能缓存;-负载均衡分配请求。解析:利用哈希表实现`O(1)`查询,随机生成短链接避免冲突。17.(5分)题目:设计一个`消息队列`(如Kafka的核心功能),要求:1.支持消息的发布与订阅;2.保证消息的`至少一次`传递;3.如何解决消息重复传递问题?答案:1.架构:-生产者(Producer)发布消息到主题(Topic);-消费者(Consumer)订阅主题并消费消息;2.消息传递保证:-生产者设置`acknowledgment`等级(如`1`表示需要Broker确认);-消费者使用`offset`记录进度,手动提交或自动提交。3.解决重复传递:-消费者使用`幂等性`(如数据库记录或Redis标记已处理);-排序消费(确保按顺序处理)。解析:通过`acknowledgment`和幂等性设计保证消息可靠性。18.(5分)题目:设计一个`秒杀系统`,要求:1.支持高并发请求;2.防止超卖;3.如何保证请求的有序性?答案:1.架构:-使用`Redis`限流(如`Lua脚本`);-使用`ZSET`记录请求时间戳,按时间排序;2.防止超卖:-库存先扣减,再判断是否超卖;-使用`分布式锁`(如`RedisLock`)保证原子性。3.有序性:-请求按`时间戳`排序,先到先得。解析:通过Redis和锁机制保证高并发下的正确性。19.(5分)题目:设计一个`分布式计数器`,要求:1.支持多节点并发计数;2.高可用且数据一致。答案:1.方案:-使用`Redis`的`INCR`命令;-或使用`Zookeeper`的`计数器节点`。2.高可用:-配置`RedisCluster`或`哨兵`;-使用`分布式锁`防止并发冲突。解析:Redis的原子性操作保证了计数器的正确性。20.(5分)题目:设计一个`分布式任务调度系统`,要求:1.支持定时任务;2.可动态添加或删除任务;3.保证任务不丢失。答案:1.架构:-使用`Quartz`+`Redis`存储任务列表;-每个节点定时从Redis获取任务并执行。2.动态任务:-生产者(如RPC接口)修改Redis任务列表;-消费者(调度节点)实时监听更新。3.不丢失:-任务执行后记录状态,失败则重新入队。解析:结合Redis和分布式节点实现任务的动态调度和可靠性。三、数据库与存储(5题,共25分)21.(5分)题目:解释`MySQL`中的`索引`类型(`B-Tree`、`Hash`、`Full-Text`),分别适用于哪些场景?答案:1.B-Tree索引:-适用:`=、>、<、>=、<=、IN、LIKE'xxx%'`;-场景:通用查询(如主键、普通查询)。2.Hash索引:-适用:`=`操作;-场景:精确匹配(如`user_id=100`)。3.Full-Text索引:-适用:`MATCH...AGAINST`;-场景:全文搜索(如搜索引擎)。解析:根据查询类型选择合适的索引类型,避免不必要的索引开销。22.(5分)题目:如何优化`MySQL`的`慢查询`?答案:1.分析慢查询:-开启`slow_query_log`记录慢查询;-使用`EXPLAIN`分析查询计划。2.优化方法:-添加索引(尤其是`WHERE`、`JOIN`条件);-分解复杂查询(如`IN`改为`JOIN`);-使用`覆盖索引`(索引包含查询字段)。解析:通过分析查询计划和索引优化提升性能。23.(5分)题目:`MySQL`中的`事务`隔离级别有哪些?如何防止`脏读`、`不可重复读`、`幻读`?答案:1.隔离级别:-`READUNCOMMITTED`(脏读);-`READCOMMITTED`(不可重复读);-`REPEATABLEREAD`(幻读);-`SERIALIZABLE`(完全隔离)。2.防止问题:-`脏读`:`READCOMMITTED`或更高;-`不可重复读`:`REPEATABLEREAD`或更高;-`幻读`:`SERIALIZABLE`。解析:通过隔离级别控制事务可见性,`SERIALIZABLE`最严格。24.(5分)题目:`Redis`的`RDB`和`AOF`持久化方案优缺点是什么?如何选择?答案:1.RDB优缺点:-优点:空间占用小,恢复快;-缺点:无法记录中间故障的数据丢失。2.AOF优缺点:-优点:可靠性高(可配置`everysec`);-缺点:写入性能较低(但可用`appendonly`优化)。3.选择:-对数据一致性要求高:`AOF`;-对性能要求高:`RDB`+定期`AOF`恢复。解析:根据业务需求选择合适的持久化方案。25.(5分)题目:如何设计一个`分布式数据库分库分表`方案?答案:1.分库:-按`业务线`分库(如`order_db`、`user_db`);-使用`中间件`(如`ShardingSphere`)。2.分表:-水平分表(如按`id%100`分表);-垂直分表(如`user_info`、`user_address`)。3.跨分片查询:-需要聚合场景使用`分布式SQL`(如`Tidb`)。解析:通过分库分表提升扩展性,但需注意跨分片问题。四、网络与系统(5题,共25分)26.(5分)题目:解释`TCP`的`三次握手`和`四次挥手`过程。答案:1.三次握手:-`SYN->SYN+AC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年河南医学高等专科学校高职单招职业适应性考试备考题库及答案详解
- 2026年湖南生物机电职业技术学院高职单招职业适应性测试备考试题及答案详解
- 2026年广东环境保护工程职业学院高职单招职业适应性测试模拟试题及答案详解
- 高中生通过核quadrupoleresonance法测定本地矿物中同位素含量的课题报告教学研究课题报告
- 浙江大学法学研究生考试试卷
- 《新能源汽车在公交领域的推广应用及配套服务优化研究》教学研究课题报告
- 2026年安徽财贸职业学院单招职业技能笔试备考试题及答案详解
- 2026年黑龙江护理高等专科学校单招职业技能笔试备考试题及答案详解
- 六年级语文上册轮椅上的霍金教案苏教版(2025-2026学年)
- 部编人教版小学语文四年级上册教案蝴蝶的家学案说课套(2025-2026学年)
- 买房分手协议书范本
- 招聘及面试技巧培训
- 贵州兴义电力发展有限公司2026年校园招聘考试题库附答案
- 2025年水果连锁门店代理合同协议
- 耐克加盟协议书
- 朱棣课件教学课件
- 农业推广计划课件
- 苏教版四年级数学上册期末考试卷(附答案)
- 2026年母婴产品社群营销方案与宝妈群体深度运营手册
- 血脂分类及临床意义
- 《抽水蓄能电站建设征地移民安置规划大纲编制规程》
评论
0/150
提交评论