版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年互联网公司程序员面试考核要点一、编程基础与算法(共5题,每题10分,总分50分)1.题目:实现一个函数,输入一个正整数`n`,返回`n`的汉诺塔移动步骤(用字符串表示,例如`"A->B"`)。假设有三根柱子`A`、`B`、`C`,初始所有盘子在`A`上,目标是将所有盘子移动到`C`上。答案与解析:pythondefhanoi(n,source,target,auxiliary):ifn==1:returnf"{source}->{target}"else:return(hanoi(n-1,source,auxiliary,target)+f"{source}->{target}"+hanoi(n-1,auxiliary,target,source))示例:n=3print(hanoi(3,'A','C','B'))输出:A->B,A->C,B->C,A->B,A->C,B->C解析:汉诺塔问题采用递归解法,核心思想是:1.将前`n-1`个盘子从`A`移动到`B`(借助`C`);2.将第`n`个盘子从`A`移动到`C`;3.将前`n-1`个盘子从`B`移动到`C`(借助`A`)。时间复杂度`O(2^n)`,空间复杂度`O(n)`。2.题目:给定一个未排序的整数数组,返回其中第三大的数。如果数组不足三个数,返回最大的数。答案与解析:pythondefthird_max(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示例:[1,2,2,5,3,5]print(third_max([1,2,2,5,3,5]))#输出:2解析:维护三个变量`first`、`second`、`third`记录当前前三大的数,遍历数组时更新。关键在于避免重复数字影响。3.题目:实现一个函数,判断一个链表是否为回文链表(例如`1->2->2->1`)。答案与解析:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextdefis_palindrome(head):ifnothead:returnTrueslow=fast=headstack=[]whilefastandfast.next:stack.append(slow.val)slow=slow.nextfast=fast.next.nextiffast:slow=slow.nextwhileslow:ifslow.val!=stack.pop():returnFalseslow=slow.nextreturnTrue示例:1->2->2->1node1=ListNode(1)node2=ListNode(2)node3=ListNode(2)node4=ListNode(1)node1.next=node2node2.next=node3node3.next=node4print(is_palindrome(node1))#输出:True解析:1.使用快慢指针找到链表中间,同时将前半部分值压栈;2.比较后半部分与栈顶值是否一致;时间复杂度`O(n)`,空间复杂度`O(n)`。4.题目:给定一个字符串`s`,找到最长的回文子串(例如`s="babad"`,最长回文子串为`"bab"`或`"aba"`)。答案与解析:pythondeflongest_palindrome(s):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,left,right):whileleft>=0andright<len(s)ands[left]==s[right]:left-=1right+=1returnright-left-1示例:"babad"print(longest_palindrome("babad"))#输出:"bab"或"aba"解析:双指针法,遍历每个字符作为回文中心,向左右扩展。时间复杂度`O(n^2)`,空间复杂度`O(1)`。5.题目:实现一个LRU(最近最少使用)缓存,支持`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_key=self.order.pop(0)delself.cache[oldest_key]self.cache[key]=valueself.order.append(key)示例:capacity=2lru=LRUCache(2)lru.put(1,1)lru.put(2,2)print(lru.get(1))#输出:1lru.put(3,3)#去除key=2print(lru.get(2))#输出:-1解析:使用哈希表记录缓存值,双向链表记录访问顺序。`get`时移动节点到队尾,`put`时若超出容量则删除最久未使用节点。二、系统设计(共3题,每题20分,总分60分)1.题目:设计一个高并发的短链接系统(例如`tinyurl`),要求支持秒级生成和查询。答案与解析:核心组件:1.短链接生成:-使用62进制(`a-z`、`A-Z`、`0-9`)将`ID`映射为短字符串;-`ID`可以是自增或哈希(如`MD5+hash`);-缓存生成映射表,减少数据库查询。2.分布式ID生成器(Snowflake算法):pythonimporttimeimportthreadingclassSnowflakeID:def__init__(self,worker_id,datacenter_id,sequence=0):self.worker_id=worker_idself.datacenter_id=datacenter_idself.sequence=sequenceself.last_timestamp=-1self.worker_id_bits=5self.datacenter_id_bits=5self.sequence_bits=12self.max_worker_id=-1^(-1<<self.worker_id_bits)self.max_datacenter_id=-1^(-1<<self.datacenter_id_bits)self.sequence_mask=-1^(-1<<self.sequence_bits)self.timestamp_left_shift=self.sequence_bits+self.worker_id_bits+self.datacenter_id_bitsself.worker_id_shift=self.sequence_bits+self.worker_id_bitsself.datacenter_id_shift=self.sequence_bitsdef_get_timestamp(self):returnint(time.time()1000)defnext_id(self):timestamp=self._get_timestamp()iftimestamp<self.last_timestamp:raiseException("Clockmovedbackwards.Refusingtogenerateid.")iftimestamp==self.last_timestamp:self.sequence=(self.sequence+1)&self.sequence_maskifself.sequence==0:timestamp=self._wait_next_millis(self.last_timestamp)else:self.sequence=0self.last_timestamp=timestampid=((timestamp<<self.timestamp_left_shift)|(self.datacenter_id<<self.datacenter_id_shift)|(self.worker_id<<self.worker_id_shift)|self.sequence)returniddef_wait_next_millis(self,last_timestamp):timestamp=self._get_timestamp()whiletimestamp<=last_timestamp:timestamp=self._get_timestamp()returntimestamp3.缓存层(Redis):-将短链接映射到长链接,使用`hash`结构存储;-设置过期时间(如1小时),减少数据库压力。4.数据库(MySQL/MongoDB):-存储所有短链接映射关系,支持高并发读写;-索引`short_url`字段,加速查询。高并发优化:-CDN加速:将短链接解析服务部署在CDN节点,减少延迟;-负载均衡:多副本服务,通过`RoundRobin`或`LeastConnections`分配请求;-限流降级:使用令牌桶算法限流,熔断机制防止雪崩。2.题目:设计一个微博系统,要求支持实时发布、关注、动态刷新(如`/home`页面)。答案与解析:核心组件:1.数据存储:-动态:MySQL(InnoDB)存储`id`、`user_id`、`content`、`created_at`等;-索引:`user_id`(关注者关联)、`created_at`(时间排序);-全文索引:加速内容搜索。2.实时发布(Kafka+Flink):-用户发布动态时,消息推送到Kafka;-Flink消费消息并写入MySQL,同时触发缓存更新。3.关注系统:-关系存储:MySQL表`follows`(`follower_id`、`followee_id`);-缓存:Redis存储`user_id`关注列表,`O(1)`查询。4.动态刷新(WebSocket+WebSocket-Server):-用户连接WebSocket长连接;-服务端通过`RedisPub/Sub`广播最新动态;-消息体包含`user_id`、`动态内容`,客户端按需更新。5.分页加载:-`/home`接口支持`limit`和`offset`;-MySQL查询时使用`ORDERBYcreated_atDESCLIMIT20`;-加载更多时,请求`/home?offset=20`。高并发优化:-消息队列削峰:Kafka缓冲请求,防数据库过载;-本地缓存:用户动态先查询Redis,命中则返回;-异步更新:动态更新关注者列表时,使用Celery队列处理。3.题目:设计一个高并发的秒杀系统,要求支持排队、防刷单、秒杀成功回调。答案与解析:核心组件:1.排队系统(Redis):-用户请求时,使用`INCR`和`LPUSH`将`user_id`加入队列;-`EXPIRE`设置过期时间(如5秒),防止僵尸请求。pythondefenqueue(user_id,queue_key="sekai_queue"):redis.incr(queue_key)redis.lpush(queue_key,user_id)redis.expire(queue_key,5)2.库存扣减(Redis+Lua):-使用Lua脚本原子性执行:lualocalstock=redis.call("get",KEYS[1])ifstock>tonumber(ARGV[1])thenredis.call("decr",KEYS[1],ARGV[1])return1elsereturn0end-锁定库存时,`SETNX`防止并发扣减。3.防刷单(风控系统):-IP频率限制:Redis记录`ip:count`,超过阈值拦截;-设备限制:`device_id:count`;-行为分析:用户登录、验证码等验证。4.秒杀成功回调(消息队列):-成功秒杀后,消息推送到RabbitMQ;-消费者处理订单生成、库存回滚等。高并发优化:-分布式锁:使用Redis`SETNX`防止超卖;-异步通知:秒杀成功后,通过WebSocket推送结果;-灰度发布:小流量测试,逐步扩容。三、数据库与存储(共2题,每题15分,总分30分)1.题目:设计一个支持高并发的订单表,要求支持订单创建、查询、支付状态更新。答案与解析:表结构:sqlCREATETABLEorders(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINTNOTNULL,product_idBIGINTNOTNULL,amountDECIMAL(10,2)NOTNULL,statusENUM('pending','paid','cancelled')DEFAULT'pending',created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,INDEXidx_user(user_id),INDEXidx_product(product_id),INDEXidx_status(status));高并发优化:1.事务隔离级别:-使用`REPEATABLEREAD`(InnoDB默认),防止脏读;-支付更新时,使用`SELECT...FORUPDATE`锁定行。2.乐观锁:-在`status`字段增加版本号`version`,更新时检查版本是否一致。sqlUPDATEordersSETstatus='paid',version=version+1WHEREid=123ANDversion=2;3.缓存:-使用Redis缓存订单详情,`EXPIRE`设置5分钟;-支付成功后,通过`Pub/Sub`更新缓存。4.分库分表:-按用户ID哈希分表,避免单表过大;-使用ShardingSphere或Tars进行路由。2.题目:设计一个存储用户文件的系统,要求支持上传、下载、过期删除。答案与解析:核心组件:1.文件存储(MinIO+S3):-对象存储存储文件,支持高并发访问;-元数据存储在MySQL(`file_id`、`user_id`、`path`)。2.上传流程:-用户上传文件时,生成`file_id`(UUID);-MinIO接收文件,MySQL插入记录;-缓存`file_id`与`path`映射。3.下载流程:-查询Redis缓存`file_id`路径,命中则直接返回;-未命中则查询MySQL,返回MinIO路径。4.过期删除:-MySQL记录`expired_at`,每天定时任务清理过期文件;-MinIO生命周期策略(如30天自动删除)。高并发优化:-CDN加速:文件上传后同步到CDN,减少下载延迟;-并发上传:使用`multipartupload`分片上传,合并后保存;-缓存预热:大文件上传后,提前缓存CDN路径。四、网络与系统(共3题,每题10分,总分30分)1.题目:解释HTTP/2与HTTP/1.1的主要区别,并说明为何HTTP/2更适合微服务架构。答案与解析:HTTP/2改进:1.多路复用:允许多个请求/响应并行传输,避免队头阻塞;2.头部压缩:使用HPACK算法减少重复头部传输;3.服务器推送:动态请求前主动推送资源(如JavaScript)。微服务优势:-减少请求次数:推送API接口可合并为单次传输;-低延迟:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年数字孪生 航空发动机运维项目建议书
- 2025年数字媒体艺术专业考试试题及答案
- 2025年农村小学校长年度工作总结
- 求职面试英语拼写技巧
- 爬虫数据采集技术介绍
- 讲故事比赛活动方案
- 2026及未来5年中国陶瓷板行业市场全景调研及前景战略研判报告
- 铁矿石加工项目商业计划书
- 保护国家安全课件
- 自来水引调水工程商业计划书
- 湖南省2025-2026学年七年级历史上学期期末复习试卷(含答案)
- 2026新疆阿合奇县公益性岗位(乡村振兴专干)招聘44人考试参考试题及答案解析
- 纺织仓库消防安全培训
- 器官移植术后排斥反应的风险分层管理
- 虚拟电厂关键技术
- 事业单位清算及财务报告编写范本
- 企业尽职调查内容提纲-中英文对照
- 部编语文三年级上课文重点总复习归纳课件
- 物料提升机保养记录表
- 中华系列期刊目录
- 马口铁空罐检验标准
评论
0/150
提交评论