版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年阿里巴软件开发工程师面试题集一、编程基础与数据结构(共5题,每题10分,总分50分)1.题目:请实现一个函数,输入一个非负整数`n`,返回`n`的二进制表示中`1`的个数。例如,输入`11`(二进制为`1011`),返回`3`。要求:时间复杂度O(logn),不使用内置函数。答案:javapublicintcountBits(intn){intcount=0;while(n!=0){count+=n&1;n>>>=1;}returncount;}解析:-使用位运算`n&1`获取最低位的`0`或`1`,然后右移一位`n>>>=1`,重复直到`n`为`0`。-时间复杂度O(logn),因为每次操作减少一位。-空间复杂度O(1)。2.题目:给定一个链表,反转链表并返回反转后的头节点。例如,输入`1->2->3->4->5`,输出`5->4->3->2->1`。要求:原地反转,不使用额外空间。答案:javapublicListNodereverseList(ListNodehead){ListNodeprev=null;ListNodecurr=head;while(curr!=null){ListNodenextTemp=curr.next;curr.next=prev;prev=curr;curr=nextTemp;}returnprev;}解析:-使用三个指针`prev`、`curr`和`nextTemp`,逐个节点反转。-时间复杂度O(n),空间复杂度O(1)。3.题目:实现一个`LRUCache`(最近最少使用缓存),支持`get`和`put`操作。要求:-`get(key)`:如果键存在,返回值;否则返回`-1`。-`put(key,value)`:如果键存在,更新值;否则添加键值对。当缓存容量满时,删除最久未使用的键。-使用双向链表和哈希表实现。答案:javaclassLRUCache{classNode{intkey,value;Nodeprev,next;Node(intk,intv){key=k;value=v;}}Map<Integer,Node>map=newHashMap<>();Nodehead=newNode(0,0),tail=newNode(0,0);intcapacity;publicLRUCache(intcap){capacity=cap;head.next=tail;tail.prev=head;}publicintget(intkey){Nodenode=map.get(key);if(node==null)return-1;moveToHead(node);returnnode.value;}publicvoidput(intkey,intvalue){Nodenode=map.get(key);if(node!=null){node.value=value;moveToHead(node);}else{if(map.size()==capacity){map.remove(tail.prev.key);removeNode(tail.prev);}NodenewNode=newNode(key,value);map.put(key,newNode);addNode(newNode);}}privatevoidaddNode(Nodenode){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}privatevoidremoveNode(Nodenode){node.prev.next=node.next;node.next.prev=node.prev;}privatevoidmoveToHead(Nodenode){removeNode(node);addNode(node);}}解析:-使用双向链表维护访问顺序,哈希表快速查找。-`get`操作将节点移动到头部,`put`操作在满时删除尾节点。-时间复杂度`get`和`put`均为O(1)。4.题目:给定一个数组`nums`和一个目标值`target`,找出数组中和为`target`的两个数,并返回它们的索引。例如,`nums=[2,7,11,15]`,`target=9`,返回`[0,1]`(因为`2+7=9`)。要求:不使用重复元素。答案:javapublicint[]twoSum(int[]nums,inttarget){Map<Integer,Integer>map=newHashMap<>();for(inti=0;i<nums.length;i++){intcomplement=target-nums[i];if(map.containsKey(complement)){returnnewint[]{map.get(complement),i};}map.put(nums[i],i);}returnnewint[]{};}解析:-使用哈希表记录每个数的索引,避免重复遍历。-时间复杂度O(n),空间复杂度O(n)。5.题目:实现一个函数,检查给定字符串是否是有效的括号组合。例如,`"()"`和`"(())"`是有效的,`"(()"`是无效的。要求:仅使用`'('`、`')'`和`'{'`、`'}'`、`'['`、`']'`。答案:javapublicbooleanisValid(Strings){Stack<Character>stack=newStack<>();Map<Character,Character>map=newHashMap<>();map.put(')','(');map.put('}','{');map.put(']','[');for(charc:s.toCharArray()){if(map.containsKey(c)){if(stack.isEmpty()||stack.pop()!=map.get(c)){returnfalse;}}else{stack.push(c);}}returnstack.isEmpty();}解析:-使用栈匹配括号,左括号入栈,右括号出栈并检查是否匹配。-时间复杂度O(n),空间复杂度O(n)。二、算法设计(共4题,每题12分,总分48分)1.题目:设计一个算法,将一个非降序数组`nums`变形为`nums[0]<=nums[1]>=nums[2]<=nums[3]...`的峰谷序列。例如,输入`[1,2,3,4,5]`,输出`[1,4,2,5,3]`。要求:原地修改,时间复杂度O(n)。答案:javapublicvoidwiggleSort(int[]nums){for(inti=0;i<nums.length-1;i++){if((i%2==0&&nums[i]>nums[i+1])||(i%2==1&&nums[i]<nums[i+1])){swap(nums,i,i+1);}}}privatevoidswap(int[]nums,inti,intj){inttemp=nums[i];nums[i]=nums[j];nums[j]=temp;}解析:-遍历数组,奇数位应比相邻偶数位大,偶数位应比相邻奇数位小。-时间复杂度O(n),空间复杂度O(1)。2.题目:设计一个函数,找出数组中所有出现次数超过`n/3`的元素。例如,`nums=[1,1,1,3,3,2,2,2]`,返回`[1,2]`。要求:时间复杂度O(n),空间复杂度O(1)。答案:javapublicList<Integer>majorityElement(int[]nums){List<Integer>result=newArrayList<>();if(nums==null||nums.length==0)returnresult;intcandidate1=nums[0],candidate2=nums[0],count1=0,count2=0;for(intnum:nums){if(num==candidate1){count1++;}elseif(num==candidate2){count2++;}elseif(count1==0){candidate1=num;count1=1;}elseif(count2==0){candidate2=num;count2=1;}else{count1--;count2--;}}count1=count2=0;for(intnum:nums){if(num==candidate1)count1++;elseif(num==candidate2)count2++;}if(count1>nums.length/3)result.add(candidate1);if(count2>nums.length/3)result.add(candidate2);returnresult;}解析:-Boyer-Moore投票算法,找到两个候选者,再验证它们的次数。-时间复杂度O(n),空间复杂度O(1)。3.题目:设计一个算法,将一个`mxn`的矩阵原地旋转90度。例如,输入`[[1,2,3],[4,5,6],[7,8,9]]`,输出`[[7,4,1],[8,5,2],[9,6,3]]`。要求:原地旋转,时间复杂度O(mn)。答案:javapublicvoidrotate(int[][]matrix){intn=matrix.length;for(intlayer=0;layer<n/2;layer++){intfirst=layer;intlast=n-1-layer;for(inti=first;i<last;i++){intoffset=i-first;inttop=matrix[first][i];matrix[first][i]=matrix[last-offset][first];matrix[last-offset][first]=matrix[last][last-offset];matrix[last][last-offset]=matrix[i][last];matrix[i][last]=top;}}}解析:-分层旋转,每层按顺时针方向移动四个元素。-时间复杂度O(mn),空间复杂度O(1)。4.题目:设计一个算法,找出字符串中的最长回文子串。例如,`s="babad"`,返回`"bab"`或`"aba"`。要求:时间复杂度O(n^2),空间复杂度O(1)。答案:javapublicStringlongestPalindrome(Strings){if(s==null||s.length()<1)return"";intstart=0,end=0;for(inti=0;i<s.length();i++){intlen1=expandAroundCenter(s,i,i);intlen2=expandAroundCenter(s,i,i+1);intlen=Math.max(len1,len2);if(len>end-start){start=i-(len-1)/2;end=i+len/2;}}returns.substring(start,end+1);}privateintexpandAroundCenter(Strings,intleft,intright){while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){left--;right++;}returnright-left-1;}解析:-中心扩展法,遍历每个字符作为中心,扩展左右。-时间复杂度O(n^2),空间复杂度O(1)。三、系统设计(共2题,每题20分,总分40分)1.题目:设计一个简单的微博系统,要求支持以下功能:-用户注册、登录。-发布微博(包含文本内容、时间戳、用户ID)。-按时间倒序查看用户的所有微博。-按时间倒序查看用户的关注者看到的微博(包含用户自己发的和关注的人发的)。-支持关注/取消关注用户。要求:说明核心数据结构和主要接口设计。答案:-数据结构:-`User`:用户表(`UserID`,`Username`,`Password`)。-`Tweet`:微博表(`TweetID`,`UserID`,`Content`,`Timestamp`)。-`Follow`:关注表(`UserID`,`FollowedID`)。-`UserTimeline`:用户时间线(缓存用户最近`N`条微博)。-主要接口:-`register(username,password)`:注册用户。-`login(username,password)`:用户登录。-`postTweet(userID,content)`:发布微博。-`getTimeline(userID)`:获取用户时间线。-`getFeed(userID)`:获取关注者时间线。-`follow(userID,followedID)`:关注用户。-`unfollow(userID,followedID)`:取消关注。-核心逻辑:-`getTimeline`:直接从`UserTimeline`获取。-`getFeed`:合并关注者的`Tweet`,按时间排序。-使用分页加载减少数据量。解析:-微博系统核心是用户关系和时间线展示。-关注关系用图表示,时间线用数据库索引优化。-缓存热点用户时间线提高性能。2.题目:设计一个短链接生成服务(如`tinyurl`),要求:-输入长链接,生成短链接。-输入短链接,解析为长链接。-短链接唯一且可快速生成/解析。-支持自定义短链接前缀(可选)。要求:说明数据结构、算法和分布式方案。答案:-数据结构:-`Link`:链接表(`ShortID`,`LongURL`,`CreatorID`)。-使用自增ID或Base62编码(如`a-zA-Z0-9`)生成`ShortID`。-算法:-生成短ID:将自增ID转换为62进制。-解析短ID:将62进制转换回自增ID,查表获取长链接。-分布式方案:-使用分布式数据库(如RedisCluster)存储`Link`。-高可用:多副本冗余,负载均衡。-接口设计:-`shorten(longURL,prefix)`:生成短链接。-`resolve(shortID)`:解析短链接。解析:-关键是短ID生成和快速查找。-Base62编码减少短ID长度。-分布式部署保证高并发和容灾。四、数据库与中间件(共3题,每题15分,总分45分)1.题目:设计一个数据库表,存储用户的订单信息,要求:-支持按用户ID和订单时间范围查询。-支持按订单状态(待支付、已支付、已发货)统计数量。-说明表结构、索引设计和查询优化。答案:-表结构:sqlCREATETABLEOrders(OrderIDINTPRIMARYKEYAUTO_INCREMENT,UserIDINT,OrderTimeDATETIME,StatusENUM('pending','paid','shipped'),AmountDECIMAL(10,2));-索引设计:-主键索引`OrderID`。-聚合索引`(UserID,OrderTime)`支持按用户和时间范围查询。-单列索引`Status`支持状态统计。-查询优化:-查询示例:sqlSELECTFROMOrdersWHEREUserID=?ANDOrderTimeBETWEEN?AND?;SELECTStatus,COUNT()FROMOrdersWHEREStatus
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五上第10课 传统美德 源远流长 第一课课件
- 2025年北京邮电大学人工智能学院招聘备考题库(人才派遣)及参考答案详解1套
- 2025年南宁市良庆区大沙田街道办事处公开招聘工作人员备考题库及一套参考答案详解
- 2025年中国人民大学物业管理中心现面向社会公开招聘非事业编制工作人员备考题库及1套完整答案详解
- 2025年成都市龙泉驿区同安中学校小学部面向社会公开招聘临聘教师备考题库及完整答案详解1套
- 2025年青海能源投资集团有限责任公司招聘备考题库及1套完整答案详解
- 2025年武汉某初级中学招聘备考题库及完整答案详解一套
- 2025年重庆医科大学附属北碚医院重庆市第九人民医院招聘非在编护理员备考题库完整参考答案详解
- 2025年上海三毛资产管理有限公司招聘备考题库含答案详解
- 河南轻工职业学院2025年公开招聘工作人员(硕士)备考题库及答案详解1套
- 维修班组长设备故障应急处理流程
- 2026年湖南司法警官职业学院单招职业技能测试题库及完整答案详解1套
- 兔年抽红包课件
- DB31∕T 634-2020 电动乘用车运行安全和维护保障技术规范
- 纪念长津湖战役胜利75周年课件
- 医师证租借协议书
- 分割林地协议书范本
- 医学类药学专业毕业论文
- 中国与东盟贸易合作深化路径与实践
- 烟酒店委托合同范本
- 2025-2026学年上海市浦东新区九年级(上)期中语文试卷
评论
0/150
提交评论