2026年京东技术面试题及答案详解_第1页
2026年京东技术面试题及答案详解_第2页
2026年京东技术面试题及答案详解_第3页
2026年京东技术面试题及答案详解_第4页
2026年京东技术面试题及答案详解_第5页
已阅读5页,还剩17页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

2026年京东技术面试题及答案详解一、编程基础(5题,每题2分,共10分)1.题目:请编写一个函数,实现判断一个字符串是否为回文字符串。回文字符串是指正读和反读都相同的字符串,例如"madam"、"racecar"。要求忽略大小写和非字母字符。答案与解析:pythondefis_palindrome(s:str)->bool:s=''.join(c.lower()forcinsifc.isalnum())returns==s[::-1]解析:-首先将字符串转换为小写,并过滤掉非字母数字字符,得到纯净的字符串`filtered_s`。-然后通过`[::-1]`反转字符串,比较反转前后是否相同。若相同,则为回文。2.题目:请实现一个函数,计算两个非负整数的最大公约数(GCD)。要求使用辗转相除法。答案与解析:pythondefgcd(a:int,b:int)->int:whileb:a,b=b,a%breturna解析:-辗转相除法原理:用较小数替换较大数,用余数替换较小数,重复直到余数为0,此时较大数即为GCD。-例如,gcd(48,18):48%18=12,18%12=6,12%6=0,返回6。3.题目:请编写一个函数,实现合并两个有序链表,返回合并后的有序链表头节点。假设链表节点定义如下:pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=next答案与解析:pythondefmerge_two_lists(l1:ListNode,l2:ListNode)->ListNode:dummy=ListNode(0)current=dummywhilel1andl2:ifl1.val<l2.val:current.next=l1l1=l1.nextelse:current.next=l2l2=l2.nextcurrent=current.nextcurrent.next=l1orl2returndummy.next解析:-使用虚拟头节点`dummy`简化边界处理。-比较`l1`和`l2`当前节点的值,将较小节点接入`current`,并移动对应链表指针。-最后将剩余部分直接接入。4.题目:请实现快速排序算法,对列表进行排序。要求原地排序(不使用额外空间)。答案与解析:pythondefquick_sort(arr:list)->list:defpartition(low,high):pivot=arr[high]i=low-1forjinrange(low,high):ifarr[j]<=pivot:i+=1arr[i],arr[j]=arr[j],arr[i]arr[i+1],arr[high]=arr[high],arr[i+1]returni+1def_quick_sort(low,high):iflow<high:pi=partition(low,high)_quick_sort(low,pi-1)_quick_sort(pi+1,high)_quick_sort(0,len(arr)-1)returnarr解析:-快速排序核心是分治思想:-选择基准值(通常取最后一个元素)。-将数组划分为小于基准和大于基准的两部分。-递归对左右两部分排序。-原地排序通过交换元素实现,不额外分配空间。5.题目:请编写一个函数,实现二叉树的层序遍历(按从上到下、从左到右的顺序)。假设二叉树节点定义如下:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=right答案与解析:pythonfromcollectionsimportdequedeflevel_order(root:TreeNode)->list:ifnotroot:return[]result=[]queue=deque([root])whilequeue:level_size=len(queue)level_nodes=[]for_inrange(level_size):node=queue.popleft()level_nodes.append(node.val)ifnode.left:queue.append(node.left)ifnode.right:queue.append(node.right)result.append(level_nodes)returnresult解析:-使用队列实现BFS:-初始化队列并加入根节点。-每次处理当前层的所有节点,将其子节点加入队列。-直到队列为空。二、系统设计(2题,每题5分,共10分)1.题目:设计一个短链接系统(如tinyURL),要求支持以下功能:-输入任意长URL,生成固定长度的短链接。-通过短链接能反查并返回原始URL。-系统需支持高并发访问。答案与解析:核心设计:1.短链接生成:-使用自增ID或随机算法生成唯一标识符(如6位base62编码:a-z,A-Z,0-9)。-压缩ID存储,避免冲突(如哈希碰撞处理)。2.存储方案:-使用Redis(内存+持久化)存储映射关系(`短链接->原始URL`),支持原子操作和高并发读写。-关联数据库(如MySQL)备份,用于数据恢复。3.高并发处理:-负载均衡分配请求到多个后端节点。-缓存热点短链接(如本地缓存+分布式缓存)。4.反查机制:-接收短链接,通过Redis快速查找并返回原始URL。-若未命中,则查询数据库。伪代码示例:pythondefgenerate_short_url(long_url:str)->str:生成唯一ID并编码为短链接unique_id=generate_unique_id()short_url=base62_encode(unique_id)redis.set(short_url,long_url)returnshort_urldefresolve_short_url(short_url:str)->str:original_url=redis.get(short_url)iforiginal_url:returnoriginal_urlelse:查询数据库returndatabase.get(short_url)5.题目:设计一个高并发的秒杀系统,要求支持百万级用户秒杀,要求:-防止超卖和并发抢购。-请求需经过限流处理。-系统需具备高可用性。答案与解析:核心设计:1.防止超卖:-使用Redis的原子扣减库存操作(`DECR`命令)。-设置库存键的过期时间(如10秒),避免超卖。2.并发控制:-请求先经过分布式锁(如Redis`SETNX`)或本地锁,确保同一用户只能抢一次。-使用CAS(Compare-And-Swap)算法处理库存扣减。3.限流方案:-使用Redis`RateLimiter`或令牌桶算法,限制每个IP或用户的请求频率。-超限请求返回排队信息,告知用户稍后重试。4.高可用性:-使用多副本Redis集群,避免单点故障。-应用层使用负载均衡(如Nginx+Keepalived)。-订单和库存数据通过消息队列(如Kafka)异步处理,确保一致性。伪代码示例:pythondef秒杀下单(user_id:str,item_id:str):限流检查ifnotrate_limiter.allow_request(user_id):return"限流"分布式锁lock_key=f"lock:{item_id}"ifnotredis.setnx(lock_key,user_id):return"已抢购"try:原子扣减库存stock_key=f"stock:{item_id}"remaining_stock=redis.decr(stock_key,1)ifremaining_stock<0:redis.incr(stock_key,1)#恢复库存return"库存不足"创建订单(异步)create_order(user_id,item_id)return"下单成功"finally:redis.delete(lock_key)三、数据库与中间件(3题,每题3分,共9分)1.题目:解释MySQL事务的ACID特性,并说明如何实现持久化(Durability)。答案与解析:-ACID特性:-原子性(Atomicity):事务要么全部成功,要么全部回滚(通过日志实现)。-一致性(Consistency):事务执行前后数据库状态符合业务规则(如主键唯一、外键约束)。-隔离性(Isolation):并发事务互不干扰(通过锁或MVCC实现)。-持久性(Durability):事务提交后数据永久保存(通过redolog+binlog)。-持久化实现:-RedoLog(重做日志):事务提交前,所有修改先写入内存日志,提交后异步刷写磁盘,确保崩溃后可恢复。-BinLog(二进制日志):记录DDL和DML语句,用于主从复制和故障恢复。2.题目:比较Redis和MySQL在缓存穿透、缓存击穿和缓存雪崩问题上的解决方案。答案与解析:|问题|解决方案(Redis)|解决方案(MySQL)|||-|--||缓存穿透|存储空值(如`null`)+互斥锁/布隆过滤器|延迟加载/查询MySQL时加锁||缓存击穿|设置热点数据永不过期+互斥锁|限制并发查询||缓存雪崩|设置随机过期时间+缓存预热|多主库负载均衡+异步写入|3.题目:说明Kafka如何保证消息的顺序性,并解释其如何实现持久化。答案与解析:-消息顺序性:-在单个分区(Partition)内,消息按顺序写入,消费者按顺序读取。-若需全局顺序,需将所有消息写入同一分区(适用于强一致性场景)。-持久化机制:-日志文件(LogSegments):消息追加到磁盘文件,不覆盖,支持随机读写。-ISR(In-SyncReplicas):主副本同步数据到多个从副本,保证高可用。-Zookeeper/Controller:维护分区和副本状态,保证幂等写入。四、分布式与架构(3题,每题4分,共12分)1.题目:解释CAP理论,并说明在分布式场景下如何选择一致性(Consistency)、可用性(Availability)和分区容错性(PartitionTolerance)。答案与解析:-CAP理论:-一致性:所有节点数据实时同步。-可用性:系统始终响应请求(不保证返回最新数据)。-分区容错性:网络分区下系统仍能运行。-权衡策略:-金融/交易系统:选择CP(如分布式事务+Raft协议)。-社交/电商系统:选择AP(如最终一致性+本地缓存)。-中间件:Redis(AP)、Zookeeper(CP)。2.题目:设计一个分布式任务调度系统,要求支持任务分片、定时执行和结果回调。答案与解析:核心组件:1.任务注册中心(Zookeeper/Redis):存储任务元数据(ID、类型、时间表达式)。2.调度器:-定期扫描过期任务,分配到可用节点(负载均衡)。-每个任务分片独立执行,失败重试。3.结果存储(MQ/Kafka):任务结果异步发送给消费者(如通知服务)。伪代码:python任务注册zookeeper.set(f"tasks/{task_id}",{"type":"batch","expression":"/5","status":"pending"})分片执行defexecute_task(task_id):task=zookeeper.get(f"tasks/{task_id}")forchunkinsplit_into_chunks(task):ifnotworker_pool.apply_async(chunk):retry_later(task_id)3.题目:解释分布式事务的两种方案(2PC和TCC)的优缺点,并说明如何优化2PC的缺点。答案与解析:|方案|优点|缺点||--|--|--||2PC|强一致性、实现简单|磷酸钙石问题(网络分区)、阻塞长事务||TCC|可靠消息模式、灵活回滚|开发复杂、状态同步难|2PC优化:-多版本协议:允许部分提交。-超时补偿:提交失败后自动回滚。-本地事务+补偿事务:先本地提交,后续补偿。五、算法与数据结构(4题,每题4分,共16分)1.题目:给定一个数组,找出其中重复次数最多的元素及其出现次数。答案与解析:pythonfromcollectionsimportCounterdeffind_most_frequent(arr:list)->tuple:counts=Counter(arr)most_common=counts.most_common(1)[0]returnmost_common[0],most_common[1]解析:-使用`Counter`统计频率,`most_common`返回最高频元素。2.题目:实现二分查找算法,要求处理重复元素时返回最左边的目标值索引。答案与解析:pythondefbinary_search_leftmost(arr:list,target:int)->int:left,right=0,len(arr)-1result=-1whileleft<=right:mid=(left+right)//2ifarr[mid]==target:result=midright=mid-1#继续向左查找elifarr[mid]<target:left=mid+1else:right=mid-1returnresult解析:-当找到目标值时,不立即返回,而是向左移动`right`指针,确保找到最左索引。3.题目:给定两个字符串,判断是否可以通过插入若干字符使其中一个变为另一个。例如,"abc"和"abracadabra"返回True。答案与解析:pythondefcan_insert_to_form(s1:str,s2:str)->bool:m,n=len(s1),len(s2)dp=[[False](n+1)for_inrange(m+1)]dp[0][0]=Trueforiinrange(1,m+1):dp[i][0]=Falseforjinrange(1,n+1):dp[0][j]=dp[0][j-1]ands2[j-1]==''foriinrange(1,m+1):forjinrange(1,n+1):dp[i][j]=(s1[i-1]==s2[j-1])ordp[i][j-1]returndp[m][n]解

温馨提示

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

评论

0/150

提交评论