版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年阿里巴巴中高级岗位面试笔试题集一、编程题(共3题,每题20分)1.编程题(Java)题目:实现一个LRU(LeastRecentlyUsed)缓存机制,支持get和put操作。缓存容量为固定值,当缓存满时,需要淘汰最久未使用的元素。请用Java代码实现,并说明时间复杂度。答案:javaimportjava.util.HashMap;publicclassLRUCache<K,V>{privatefinalintcapacity;privatefinalHashMap<K,Node<K,V>>map;privatefinalNode<K,V>head,tail;publicLRUCache(intcapacity){this.capacity=capacity;map=newHashMap<>();head=newNode<>(null,null);tail=newNode<>(null,null);head.next=tail;tail.prev=head;}publicVget(Kkey){Node<K,V>node=map.get(key);if(node==null)returnnull;moveToHead(node);returnnode.value;}publicvoidput(Kkey,Vvalue){Node<K,V>node=map.get(key);if(node==null){Node<K,V>newNode=newNode<>(key,value);map.put(key,newNode);addNode(newNode);if(map.size()>capacity){Node<K,V>tailNode=removeTail();map.remove(tailNode.key);}}else{node.value=value;moveToHead(node);}}privatevoidaddNode(Node<K,V>node){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}privatevoidremoveNode(Node<K,V>node){node.prev.next=node.next;node.next.prev=node.prev;}privatevoidmoveToHead(Node<K,V>node){removeNode(node);addNode(node);}privateNode<K,V>removeTail(){Node<K,V>res=tail.prev;removeNode(res);returnres;}privatestaticclassNode<K,V>{Kkey;Vvalue;Node<K,V>prev;Node<K,V>next;Node(Kkey,Vvalue){this.key=key;this.value=value;}}}解析:-使用双向链表+哈希表实现LRU缓存。哈希表用于O(1)时间复杂度访问节点,双向链表维护使用顺序。-get操作将节点移动到链表头部,put操作在链表头部插入新节点,若超出容量则删除链表尾部节点。-时间复杂度:get和put均为O(1)。2.编程题(Python)题目:给定一个包含重复数字的数组,找出所有不重复的3数组合,要求组合中数字升序排列。例如,输入[1,2,2,3],输出[[1,2,3]]。答案:pythondefthreeSum(nums):nums.sort()res=[]n=len(nums)foriinrange(n-2):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==0:res.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-=1returnres解析:-先排序数组,避免重复组合。-固定第一个数,使用双指针法查找另外两个数,确保组合升序。-跳过重复值,避免重复组合。-时间复杂度:O(n²)。3.编程题(C++)题目:实现一个无锁(lock-free)栈,使用C++11标准库。要求push和pop操作原子性,不支持空栈判断。答案:cppinclude<atomic>include<iostream>template<typenameT>classLockFreeStack{private:structNode{Tdata;std::atomic<Node>next;Node(Tval):data(val),next(nullptr){}};std::atomic<Node>head;public:voidpush(Tval){NodenewNode=newNode(val);newNode->next=nullptr;while(true){NodeoldHead=head.load(std::memory_order_acquire);newNode->next=oldHead;if(pare_exchange_weak(oldHead,newNode,std::memory_order_release,std::memory_order_relaxed)){return;}}}Tpop(){while(true){NodeoldHead=head.load(std::memory_order_acquire);if(oldHead==nullptr){throwstd::runtime_error("Stackisempty");}NodenewHead=oldHead->next;if(pare_exchange_weak(oldHead,newHead,std::memory_order_release,std::memory_order_relaxed)){Tdata=oldHead->data;deleteoldHead;returndata;}}}};解析:-使用原子操作保证push和pop的原子性。-push时,将新节点插入头部,并更新head指针。-pop时,删除头部节点并返回数据。-使用compare_exchange_weak实现CAS操作,确保无锁正确性。-时间复杂度:O(1),但可能因CAS失败导致重试。二、算法题(共5题,每题15分)1.算法题:字符串匹配题目:给定主串S和子串T,实现KMP(Knuth-Morris-Pratt)算法,返回子串T在主串S中的起始索引,若不存在返回-1。答案:javapublicintkmpSearch(StringS,StringT){if(T.isEmpty())return0;int[]lps=computeLPSArray(T);inti=0,j=0;while(i<S.length()){if(T.charAt(j)==S.charAt(i)){i++;j++;}if(j==T.length()){returni-j;}elseif(i<S.length()&&T.charAt(j)!=S.charAt(i)){if(j!=0){j=lps[j-1];}else{i++;}}}return-1;}privateint[]computeLPSArray(StringT){int[]lps=newint[T.length()];intlen=0;inti=1;lps[0]=0;while(i<T.length()){if(T.charAt(i)==T.charAt(len)){len++;lps[i]=len;i++;}else{if(len!=0){len=lps[len-1];}else{lps[i]=0;i++;}}}returnlps;}解析:-构建LPS(最长公共前后缀)数组,用于避免重复比较。-当匹配失败时,使用LPS数组跳过已知匹配的部分。-时间复杂度:O(n+m),n为S长度,m为T长度。2.算法题:图的最短路径题目:给定一个加权无向图,使用Dijkstra算法求从起点到终点的最短路径,若不存在返回无穷大。答案:javaimportjava.util.;publicclassDijkstra{publicstaticintdijkstra(int[][]graph,intstart,intend){intn=graph.length;int[]dist=newint[n];Arrays.fill(dist,Integer.MAX_VALUE);dist[start]=0;PriorityQueue<Integer>pq=newPriorityQueue<>(CparingInt(a->dist[a]));pq.offer(start);boolean[]visited=newboolean[n];while(!pq.isEmpty()){intu=pq.poll();if(visited[u])continue;visited[u]=true;if(u==end)returndist[u];for(intv=0;v<n;v++){if(graph[u][v]>0){intnewDist=dist[u]+graph[u][v];if(newDist<dist[v]){dist[v]=newDist;pq.offer(v);}}}}returndist[end]==Integer.MAX_VALUE?-1:dist[end];}}解析:-使用优先队列(小顶堆)维护待处理节点,按距离排序。-每次从队列中取出距离最小的节点,更新其邻接节点的距离。-时间复杂度:O((E+V)logV),E为边数,V为顶点数。3.算法题:动态规划题目:给定一个字符串,判断是否可以通过删除一些字符使其变为回文串。例如,输入"aba",返回true;输入"abc",返回false。答案:javapublicbooleanvalidPalindrome(Strings){intleft=0,right=s.length()-1;while(left<right){if(s.charAt(left)!=s.charAt(right)){returnisPalindrome(s,left+1,right)||isPalindrome(s,left,right-1);}left++;right--;}returntrue;}privatebooleanisPalindrome(Strings,intleft,intright){while(left<right){if(s.charAt(left)!=s.charAt(right)){returnfalse;}left++;right--;}returntrue;}解析:-双指针法从两端向中间遍历,当遇到不匹配字符时,尝试跳过左或右字符,继续检查。-时间复杂度:O(n)。4.算法题:二叉树题目:给定一个二叉树,返回其最大深度。例如,输入[3,9,20,null,null,15,7],返回3。答案:javapublicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx){val=x;}}publicintmaxDepth(TreeNoderoot){if(root==null)return0;return1+Math.max(maxDepth(root.left),maxDepth(root.right));}解析:-递归计算左右子树的最大深度,取较大值加1。-时间复杂度:O(n),n为节点数。5.算法题:贪心算法题目:给定一组整数,每个整数代表一个区间的左端点,右端点为当前整数+1。例如,输入[1,2,3,4,5],返回最多可以选择的区间数量。答案:javapublicinteraseOverlapIntervals(int[]intervals){if(intervals.length==0)return0;Arrays.sort(intervals);intcount=1;intend=intervals[0];for(inti=1;i<intervals.length;i++){if(intervals[i]>=end){count++;end=intervals[i];}}returncount;}解析:-先排序按左端点,贪心选择右端点最小的区间。-时间复杂度:O(nlogn)。三、系统设计题(共2题,每题25分)1.系统设计题:短链接服务题目:设计一个短链接服务,要求:-输入长链接,输出短链接,支持自定义短域名。-支持通过短链接快速跳转至长链接。-高并发、高可用,支持每日千亿级访问量。答案:-架构:-前端:Nginx负载均衡,反向代理请求到后端服务集群。-后端:无状态服务集群(如K8s部署),使用Redis缓存热点短链接。-数据库:分片MySQL存储长链接和短链接映射关系。-分布式ID生成器(如TwitterSnowflake)。-流程:1.客户端请求长链接,后端生成唯一ID,存入数据库(长链接->ID)。2.ID编码为短链接(如62进制),自定义域名拼接。3.缓存热点短链接ID->长链接映射。4.用户访问短链接,Nginx转发到后端,查Redis缓存,若不存在查数据库。-优化:-CDN加速短链接域名解析。-异步写入数据库,提高吞吐量。解析:-关键点:分布式ID、Redis缓存、数据库分片、异步写入。-时间复杂度:O(1)访问,O(logn)写入。2.系统设计题:实时消息推送服务题目:设计一个实时消息推送服务,要求:-支持多端(Web、App、IoT),用户可自定义接收设备。-支持离线消息存储,用户上线后自动拉取。-高并发、低延迟,支持百万级用户实时推送。答案:-架构:-消息中心:RocketMQ/Kafka异步队列,处理消息生产。-推送服务:无状态服务集群,按用户ID分片。-推送客户端:WebSocket/WebRTC,支持实时连接。-离线存储:Redis存储用户在线状态和消息队列。-流程:1.客户端注册设备ID,绑定用户ID。2.消息生产者发送消息(用户ID+消息内容),存入MQ。3.推送服务消费MQ消息,按用户ID路由到对应分片。4.若用户离线,消息存入Redis,上线后拉取。5.客户端实时连接推送服务,接收消息。-优化:-群组推送优化,减少重复连接建立。-消息去重,避免重复推送。解析:-关键点:异步队列、无状态服务、离线存储、实时连接。-时间复杂度:推送O(1),拉取O(n)。四、综合题(共2题,每题30分)1.综合题:双十一大促系统
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年琼台师范学院单招综合素质笔试参考题库含详细答案解析
- 2026江苏南京大学海外教育学院办公室文员招聘参考考试试题及答案解析
- 2026年郑州工商学院单招职业技能考试备考试题含详细答案解析
- 2026年南阳科技职业学院单招综合素质考试备考试题含详细答案解析
- 2026年南充科技职业学院单招综合素质考试参考题库含详细答案解析
- 2026年湖北生态工程职业技术学院单招综合素质笔试模拟试题含详细答案解析
- 2026年安康所见所得(紫阳县)旅游服务有限公司招聘考试重点题库及答案解析
- 2026年马鞍山港润水务有限公司公开招聘劳务派遣人员1名考试重点题库及答案解析
- 2026年内蒙古丰州职业学院单招职业技能考试备考题库含详细答案解析
- 2026年湖南理工职业技术学院单招综合素质考试参考题库含详细答案解析
- 单杠引体向上教学课件
- 高级消防设施操作员试题及答案-1
- 2025年海南省政府采购评审专家考试题库(含答案)
- 绵阳普通话考试题目含答案
- 国企财务审批管理办法
- 新型农业经营主体法律制度完善研究
- 高中国际班数学试卷
- 北京市2019-2024年中考满分作文131篇
- 2024-2025学年湖北省武汉市常青联合体高二上学期期末考试语文试题(解析版)
- xx中学十五五发展规划(2025-2030)
- 快递保证金合同协议
评论
0/150
提交评论