杭州IT企业技术面试题及答案_第1页
杭州IT企业技术面试题及答案_第2页
杭州IT企业技术面试题及答案_第3页
杭州IT企业技术面试题及答案_第4页
杭州IT企业技术面试题及答案_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

2026年杭州IT企业技术面试题及答案一、编程语言基础(共5题,每题6分,总分30分)1.题目(JavaScript):编写一个JavaScript函数,实现将数组中的所有奇数移到前面,偶数移到后面,并保持奇数和偶数内部的相对顺序。例如,输入`[1,2,3,4,5]`,输出`[1,3,5,2,4]`。答案:javascriptfunctionreorderArray(arr){constodd=[];consteven=[];arr.forEach(num=>{if(num%2===1)odd.push(num);elseeven.push(num);});returnodd.concat(even);}解析:-使用两个数组`odd`和`even`分别存储奇数和偶数。-遍历输入数组,按奇偶性分配到对应数组。-最后合并`odd`和`even`数组,确保顺序不变。2.题目(Java):在Java中,编写一个方法,接收一个字符串,返回该字符串中所有单词的长度之和。例如,输入`"HelloWorld"`,输出`10`("Hello"5+"World"5)。答案:javapublicintsumWordLengths(Strings){if(s==null||s.isEmpty())return0;String[]words=s.split("\\s+");intsum=0;for(Stringword:words){sum+=word.length();}returnsum;}解析:-使用`split("\\s+")`按空白字符拆分字符串为单词。-遍历单词数组,累加每个单词的长度。-空字符串或`null`输入返回`0`。3.题目(Python):编写一个Python函数,接收一个列表,返回一个新列表,其中包含所有子列表的最小值。例如,输入`[[3,1,2],[4,5],[6,7,8]]`,输出`[1,4,6]`。答案:pythondefmin_of_sublists(lst):return[min(sub)forsubinlst]解析:-使用列表推导式,对每个子列表调用`min()`函数获取最小值。-适用于嵌套列表,假设所有子列表非空。4.题目(C++):实现一个C++函数,接收一个整数数组,返回该数组的中位数。例如,输入`[1,3,2]`,输出`2`。答案:cppinclude<algorithm>include<vector>intfindMedian(std::vector<int>&arr){std::sort(arr.begin(),arr.end());intn=arr.size();if(n%2==1)returnarr[n/2];elsereturn(arr[n/2-1]+arr[n/2])/2;}解析:-先对数组排序,中位数位于中间位置。-奇数长度返回中间值,偶数长度返回中间两数之和的一半。5.题目(Go):编写一个Go函数,接收两个整数,返回它们的最大公约数(GCD)。答案:gofuncgcd(a,bint)int{forb!=0{a,b=b,a%b;}returna;}解析:-使用欧几里得算法,通过循环替换`a`和`b`直到`b`为`0`。-最终`a`即为GCD。二、数据结构与算法(共6题,每题6分,总分36分)1.题目(链表):实现一个函数,删除链表的倒数第`n`个节点。例如,输入链表`[1,2,3,4,5]`和`n=2`,删除后为`[1,2,3,5]`。答案(Python):pythonclassListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextdefremoveNthFromEnd(head,n):dummy=ListNode(0)dummy.next=headfast=slow=dummyfor_inrange(n+1):fast=fast.nextwhilefast:fast=fast.nextslow=slow.nextslow.next=slow.next.nextreturndummy.next解析:-使用双指针`fast`和`slow`,`fast`先走`n+1`步,确保删除时`slow`指向目标节点前一个。-循环移动`fast`和`slow`直到`fast`到达末尾,此时`slow.next`即为待删除节点。2.题目(树):给定二叉搜索树(BST),找出其中值介于`L`和`R`之间的所有节点值的和。例如,输入`L=3,R=7`,树`[5,3,7,2,4,6,8]`,输出`18`(3+4+5+6)。答案(Java):javapublicintrangeSumBST(TreeNoderoot,intL,intR){if(root==null)return0;if(root.val<L)returnrangeSumBST(root.right,L,R);if(root.val>R)returnrangeSumBST(root.left,L,R);returnroot.val+rangeSumBST(root.left,L,R)+rangeSumBST(root.right,L,R);}解析:-利用BST性质,左子树值小于根,右子树值大于根。-递归遍历时跳过不满足范围的子树,减少冗余计算。3.题目(动态规划):实现一个函数,计算不同路径的数量(只能向右或向下移动),路径从左上角到右下角。例如,输入`3x3`网格,输出`6`。答案(JavaScript):javascriptfunctionuniquePaths(m,n){constdp=Array.from({length:m},()=>Array(n).fill(1));for(leti=1;i<m;i++){for(letj=1;j<n;j++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}returndp[m-1][n-1];}解析:-初始化`dp[i][j]`为`1`(边界条件)。-动态转移方程:`dp[i][j]=dp[i-1][j]+dp[i][j-1]`。-最终`dp[m-1][n-1]`为总路径数。4.题目(哈希表):编写一个函数,找出数组中所有出现次数超过`n/2`的元素。例如,输入`[3,2,3]`和`n=3`,输出`[3]`。答案(Python):pythondefmajorityElement(nums):count={}fornuminnums:ifnumincount:count[num]+=1else:count[num]=1ifcount[num]>len(nums)//2:return[num]return[]解析:-统计每个元素的频率,当某个元素频率超过`n/2`时立即返回。-假设至少存在一个满足条件的元素。5.题目(堆):实现一个函数,返回数组中第`k`大的元素。例如,输入`[3,2,1,5,6,4]`和`k=2`,输出`5`。答案(C++):cppinclude<vector>include<queue>intfindKthLargest(std::vector<int>&nums,intk){std::priority_queue<int,std::vector<int>,std::greater<int>>minHeap;for(intnum:nums){minHeap.push(num);if(minHeap.size()>k)minHeap.pop();}returnminHeap.top();}解析:-使用最小堆维护前`k`大元素,堆大小不超过`k`。-最终堆顶即为第`k`大值。6.题目(回溯):实现一个函数,生成`n`皇后问题的所有解。例如,`n=4`的解为:[.Q..,...Q,Q...,..Q.][...Q,Q..,.Q..,.Q..]答案(Java):javaimportjava.util.ArrayList;importjava.util.List;publicclassNQueens{publicList<List<String>>solveNQueens(intn){List<List<String>>results=newArrayList<>();backtrack(n,0,newArrayList<>(),results);returnresults;}privatevoidbacktrack(intn,introw,List<Integer>positions,List<List<String>>results){if(row==n){results.add(generateBoard(positions));return;}for(intcol=0;col<n;col++){if(isSafe(positions,row,col)){positions.add(col);backtrack(n,row+1,positions,results);positions.remove(positions.size()-1);}}}privatebooleanisSafe(List<Integer>positions,introw,intcol){for(inti=0;i<row;i++){intprevCol=positions.get(i);if(prevCol==col||Math.abs(prevCol-col)==Math.abs(i-row)){returnfalse;}}returntrue;}privateList<String>generateBoard(List<Integer>positions){List<String>board=newArrayList<>();for(intpos:positions){StringBuildersb=newStringBuilder();for(inti=0;i<positions.size();i++){sb.append(i==pos?'Q':'.');}board.add(sb.toString());}returnboard;}}解析:-回溯算法逐行放置皇后,检查列和对角线冲突。-使用`isSafe`判断位置合法性,避免皇后攻击。-生成解时将位置转换为棋盘表示。三、系统设计(共4题,每题9分,总分36分)1.题目:设计一个短链接服务(如`tinyurl`),要求支持高并发、高可用,并能在1秒内返回短链接对应的原链接。答案:-架构:-前端:Nginx负载均衡,处理请求转发。-中间层:缓存层(RedisCluster)存储短链接与原链接映射,支持高并发读取。-后端:分布式数据库(如PostgreSQL+分片),存储持久化数据。-分布式ID生成器(如Snowflake)生成唯一短码。-流程:1.用户请求生成短链接,服务分配短码并查询缓存,若无则写入数据库并缓存。2.用户访问短链接,Nginx转发请求至缓存层,命中则返回原链接,否则查询数据库并缓存。-优化:-缓存预热:启动时预加载热门短链接。-异步写入:使用消息队列(Kafka)削峰填谷。2.题目:设计一个高并发的秒杀系统,要求支持每秒10万+订单生成,并防止超卖。答案:-架构:-前端:熔断限流(Sentinel),防止后端过载。-中间层:Redis(Lua脚本原子扣减库存),防止并发问题。-后端:分布式事务(如Seata),保证订单与库存一致性。-数据库:分库分表(按商品ID),提升写入性能。-流程:1.用户请求,前端验证库存(RedisLua脚本原子扣减)。2.库存充足则创建订单,否则拒绝。3.订单创建后异步更新库存。-优化:-热点库存预热:提前加载库存到内存。-分布式锁:防止超卖极端情况。3.题目:设计一个实时推荐系统(如淘宝商品推荐),要求支持用户行为日志接入、实时计算和动态更新推荐结果。答案:-架构:-输入:Kafka消息队列收集用户行为(点击、加购等)。-处理:Flink/SparkStreaming实时计算协同过滤或深度学习模型。-缓存:Redis分用户缓存推荐结果。-输出:前端通过API调用获取推荐。-流程:1.用户行为实时写入Kafka。2.流处理平台聚合用户近30分钟行为,更新模型。3.推荐结果缓存,过期后重新计算。-优化:-滑动窗口:仅考虑用户最近行为。-混合推荐:结合热门商品与个性化推荐。4.题目:设计一个分布式文件存储系统(如对象存储OSS),要求支持高可用、高扩展和断点续传。答案:-架构:-分片存储:将文件切分1-10MB片,分布式存储(如HDFS)。-元数据服务:MySQL+Redis缓存文件元数据(片信息、MD5)。-API网关:Nginx负载均衡,处理上传/下载请求。-备份:多副本存储(如3副本),跨机房同步。-流程:1.上传:分片上传,API网关写入元数据并返回临时URL。2.断点续传:记录已上传片,重试失败片。3.下载:按片请求,API网关合并响应。-优化:-CDN缓存:加速热点文件访问。-压缩编码:减少存储和传输成本。四、数据库(共4题,每题9分,总分36分)1.题目:设计一个电商订单表,包含订单ID、用户ID、商品ID、数量、价格、下单时间、支付状态等字段,并说明索引设计。答案:sqlCREATETABLEorders(order_idBIGINTPRIMARYKEY,user_idBIGINT,product_idBIGINT,quantityINT,priceDECIMAL(10,2),order_timeTIMESTAMP,payment_statusVARCHAR(20),INDEXidx_user(user_id),INDEXidx_product(product_id),INDEXidx_time(order_time));解析:-主键`order_id`保证唯一性。-`user_id`和`product_id`用于快速查询用户订单或商品订单。-`order_time`用于按时间统计。2.题目:SQL查询:统计每个用户的订单总数和总金额,只展示订单数大于10的用户。答案:sqlSELECTuser_id,COUNT()ASorder_count,SUM(pricequantity)AStotal_amountFROMordersGROUPBYuser_idHAVINGCOUNT()>10;解析:-分组统计`user_id`对应的订单数和金额。-`HAVING`过滤订单数大于10的用户。3.题目:解释数据库事务的ACID特性及其在分布式场景下的挑战。答案:-ACID:-原子性(Atomicity):事务要么全部成功,要么全部回滚。-一致性(Consistency):事务执行后数据库状态符合业务规则。-隔离性(Isolation):并发事务互不干扰。-持久性(Durability):事务提交后结果永久保存。-挑战:-分布式事务(如Seata):通过两阶段提交(2PC)解决一致性问题,但牺牲性能。-网络分区:可能导致事务失败。4.题目:设计数据库分库分表的方案,如何解决数据倾斜问题?答案:-分库:-按业务线分库(如订单库、商品库)。-ShardingSphere负载均衡。-分表:-水平分表(如按`order_id`余数分片)。-垂直分表(如将商品信息拆分到单独表)。-数据倾斜:-限流分片键(如`user_id`)。

温馨提示

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

评论

0/150

提交评论