恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

2023春招去哪儿网Java后端笔试复盘:题型拆分与编程题解析

  • 首页
  • 资讯中心
  • /
  • 2023春招去哪儿网Java后端笔试复盘:题型拆分与编程题解析

相关资讯

基于深度学习的用户购物行为预测与可视化系统全栈解析 2026/9/1 16:56:29
ZVS升压电路设计:从原理到实践,实现高效DC-DC变换 2026/9/1 16:51:29
元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第八十二篇 流量潮汐动态拓扑重配置实时算法 2026/9/1 16:51:29

最新资讯

DFT计算过渡态:从CI-NEB精修参数到反应能垒与速率的完整实践指南
游戏与软件运行库缺失修复指南:从原理到一键解决
DS4520 九端口 I2C总线接口的IO扩展和EEPROM
基于Stable Diffusion的AI角色设计:从配色方案到风格迁移实战
地铁安检数据集 地铁铁路X光射线安检检测数据集的权重,X—ray安检 推理识别刀枪锤子打火机充电宝等 (1)
AI辅助微信小程序开发:零基础用workbuddy实现待办事项实战

今日推荐

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

2023春招去哪儿网Java后端笔试复盘:题型拆分与编程题解析

发布时间:2026/9/1 16:56:29
2023春招去哪儿网Java后端笔试复盘:题型拆分与编程题解析 2023年春招那阵子我正好完整走了一遍去哪儿网的编程岗笔试流程。当时投的是Java后端方向笔试用的牛客网在线平台双机位监控时长120分钟题量不小。整体感受是选择题考得很细编程题倒没有特别离谱的难题但时间分配稍有不慎就会做不完。这篇文章我就以过来人的身份把整场笔试的题型构成、编程题复盘、高频考点和踩坑点完整拆一遍给后面准备校招的朋友一个真实参考。很多人以为大厂笔试就是刷LeetCode其实2023年的春招已经明显偏向“工程算法”的双重考察。去哪儿这套卷子也不例外选择题占比很高覆盖了Java并发、JVM、Spring、数据库、网络协议这些硬核基础编程题则是典型的“一道简单一道中等”。如果只准备算法不补基础选择题很容易丢一半分。接下来我按考试的实际顺序把整张卷子复盘给你看。1. 笔试全貌题型构成、时间压力与最真实的体感1.1 整场考试的时间线与题型分布我记得系统显示的总时长是120分钟一共是20道单选题、10道多选题外加2道编程题。选择题按知识点杂糅在一起出不是按模块分段的前面可能是JVM题后面突然跳到计算机网络再往后又是MySQL索引。这种出题方式最考验知识体系的完整度你没法靠“临时切换思维模式”来蒙混过关。我自己的时间分配是这样选择题控制在60分钟左右留下60分钟给编程题。但说实话实际做起来选择题往往要花掉70到75分钟因为多选题的干扰项设置得非常阴险好几道题都是“以下说法正确的是”这种复合判断每个选项都要仔细推敲。如果一道多选卡住超过3分钟果断先标记跳过去不然后面编程题就危险了。整体题型可以整理成下面这张表方便你直观感受题型数量分值占比主要考察方向单选题20约40%Java基础、JVM、并发、网络、数据库、Spring多选题10约30%框架原理、中间件、场景判断编程题2约30%算法与数据结构、工程实现能力1.2 牛客网ACM模式是多数人第一个坑这里必须单独拎出来说牛客网的笔试不是LeetCode那种核心代码模式而是ACM模式也就是你需要自己处理输入输出。很多在LeetCode上刷得很顺的同学到了笔试现场连Scanner和BufferedReader怎么读多行数据都要想半天白白浪费宝贵时间。比如编程题的第一题输入格式是“第一行一个整数T表示测试数据组数接下来每组数据第一行两个整数N和M第二行N个整数”。这种输入在LeetCode里根本不会出现但牛客笔试里几乎场场都有。如果你平时没练过while (sc.hasNext())这种写法真到了考场上就是纯吃亏。我的建议是提前熟悉牛客的编程题输入输出练习页把常见的几种输入格式多组数据、单组定长、含T组、以EOF结束都手动写一遍。C选手还要记得关掉cin和cout的同步不然大数据量输入会超时。这种细节往往能决定一道题是AC还是超时。2. 编程题真题复盘最少等待时间背后的贪心与优先队列2.1 题目原貌与输入输出编程题第一道属于“读完题就有思路”的类型大概是这样的银行有M个服务窗口N个顾客排队办理业务每个顾客需要的服务时间是t_i分钟。请你安排顾客到各个窗口的顺序使得所有顾客的总等待时间最小等待时间指从开始排到业务办理结束的时间输出这个最小总等待时间。注意这里不是要求你输出具体分配方案只要输出最小值。所以这道题本质上是一道贪心调度问题和操作系统里的“短作业优先”是同一个模型。数据范围我没有记错的话N最大是10的5次方M最大是100所以O(N log N)的解法是完全可以过的。输入样例大概是3 2 2 3 1 3 2 5 2 3 4 2 1 2 3 4输出分别是对应的最小总等待时间。2.2 从暴力模拟到贪心为什么每次选最短就能最优如果你第一次见到这种题最直接的想法可能是模拟所有排列组合。但N到10万级别时全排列显然是痴心妄想。正确的切入角度是“短作业优先”思想当某个窗口空闲下来时应该优先把当前等待队列里服务时间最短的顾客分配过去。为什么这样最优我习惯用一个简单的交换论证来解释假设有两个相邻被处理的顾客A和B服务时间分别是t_a和t_b且t_a t_b。如果先处理A再处理B那么两个任务的总完成时间贡献是t_a (t_a t_b)如果先处理B再处理A贡献是t_b (t_b t_a)。对比两者前者比后者多了t_a - t_b是一个正数。所以只要存在“长任务排在短任务前面”的情况交换两者就能让总完成时间更小。反复应用这个交换最终总能得到一个按处理时间从小到大依次服务的序列这就是贪心最优性的证明。落实到多窗口场景做法就是三步先把所有顾客的服务时间从小到大排序然后用一个大小为M的最小堆维护每个窗口当前的累计工作时间逐个把顾客分配给当前累计工作时间最少的窗口。每分配一个顾客就把该窗口的累计时间加上这个顾客的服务时间同时把这次分配得到的“完成时间”也就是该顾客的等待时间累加到答案里。2.3 优先队列的代码实现与复杂度分析我用Java写了一份可以直接跑的版本import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int T sc.nextInt(); while (T-- 0) { int N sc.nextInt(); int M sc.nextInt(); int[] t new int[N]; for (int i 0; i N; i) { t[i] sc.nextInt(); } Arrays.sort(t); PriorityQueueLong pq new PriorityQueue(); for (int i 0; i M; i) { pq.offer(0L); } long ans 0; for (int i 0; i N; i) { long cur pq.poll(); cur t[i]; ans cur; pq.offer(cur); } System.out.println(ans); } } }这里有几个细节值得注意。第一个是PriorityQueue里一定要用Long而不是Integer因为累加时间可能会超过int范围。我算了算N是10的5次方每个t_i最大可能是10的4次方总等待时间最坏情况下是N的平方级别超过int上限完全有可能。第二个是初始化窗口时每个窗口的当前累计时间都是0用一个循环offer进去。第三个是排序后直接贪心分配每个窗口始终是“当前最空闲”的去接新任务这个思路也适用于很多任务调度类的场景。复杂度方面排序是O(N log N)堆操作每次是O(log M)总共N次整体还是O(N log N)。M最大只有100所以这个堆的操作成本可以忽略不计实测跑10万级数据完全没问题。这道题我大概用了10分钟写完还算顺利是整场笔试里唯一一道“做完心里有底”的题。3. 选择题暗藏的硬仗并发、数据库与网络3.1 线程池参数与拒绝策略字节跳动同款送分题选择题里有一道关于“线程池核心线程数、最大线程数、阻塞队列容量”的场景题大意是一个系统高峰期每秒请求量是2000每个任务平均执行100ms核心线程数设置为多少比较合理四个选项分别是8、16、32、64。这道题的关键不是背参数而是理解线程池的执行流程。你只要记住核心线程先扛扛不住进队列队列满了才开非核心线程开到最大线程数还不行就触发拒绝策略。所以当你计算需要的线程数时一个粗略的公式是“每秒请求数乘以平均执行时间”也就是2000 * 0.1 200这代表系统理想状态下需要大约200个并发线程。但实际工程中往往还有IO等待时间这个计算会更复杂笔试阶段理解到这一层就够了。那这种情况选哪个呢其实这里还考了“队列大小”的搭配如果队列设得很大比如10000那么非核心线程根本不会被创建系统会一直在队列里排队反而加剧延迟。所以合理的设计是核心线程数略高于CPU密集型所需队列适中最大线程数给到峰值足够。这道题没有一个绝对正确的数字而是要看你能不能理解“高并发下线程池参数是需要调优的”这件事。但我记得正确答案应该是选一个适中的不能太小也不能太大太小会频繁触发拒绝策略太大会导致上下文切换开销过高。线程池拒绝策略也是常客四个策略要分清策略行为适用场景AbortPolicy直接抛RejectedExecutionException默认策略不适合高并发压测CallerRunsPolicy交给调用线程执行不想丢任务可降速DiscardPolicy直接丢弃任务允许丢瞬时任务DiscardOldestPolicy丢弃队列中最旧的任务追求最新任务可容忍旧任务过期3.2 数据库索引与缓存三大件穿透、击穿、雪崩数据库这块选择题考了B树索引的最左前缀原则还有一个比较经典的“缓存失效三种情况区分”。先说索引题目大概是给一个联合索引(a, b, c)问哪些查询能用上索引。答案就是a、a,b、a,b,c这几种组合b单独查或者b,c组合查都用不上索引。很多人只背“最左前缀”四个字但遇到变种题就懵。比如where a 1 and c 2这种实际上只能用到a这一列c是索引不到位的这就是最左前缀的真正含义。再来说缓存穿透、击穿、雪崩这三个概念选择题给了一段线上事故描述让你判断是哪种情况穿透查询一个根本不存在的数据每次都要打到数据库缓存形同虚设。解法是布隆过滤器拦截或者缓存空值。击穿一个热点key突然过期瞬间大量请求打到数据库。解法是互斥锁或者逻辑过期主动续期。雪崩大量key在同一时间集体失效数据库被压垮。解法是过期时间加随机值错开失效时刻或者用多级缓存兜底。这三者的本质区别就一句话穿透是“数据不存在”击穿是“一个key扛不住”雪崩是“很多key同时挂”。考试时只要抓住这句话就不容易选错。3.3 JMM与volatile面试和笔试都绕不开的并发基石还有一道题问的是volatile关键字的作用选项里混着“保证原子性”“保证可见性”“禁止指令重排序”“保证线程安全”。这是典型的“看上去很简单其实陷阱重重”的题。volatile只保证可见性和有序性不保证原子性。count这种复合操作即使加了volatile多线程下依然会丢失更新正确做法是AtomicInteger或synchronized。顺带一提这道题还涉及到JMM的happens-before规则。题目问“线程A对volatile变量x写入1线程B读取x”问B是否一定能看到1答案是可以因为volatile的写-读天然具备happens-before关系。这是我当时觉得整张试卷里最“值得想一会儿”的选择题之一因为选项里会故意把“线程安全”塞进去当干扰项你要是对JMM理解不透彻很容易中招。4. Spring与中间件考点框架题也能靠底层原理反推4.1 Spring Bean生命周期印象流与源码细节的差距如果你觉得笔试只考Java基础和算法那就大错特错了。去哪儿这套卷子有将近三分之一的选择题直接围绕Spring展开其中最典型的是一道问“Bean的完整生命周期顺序”的排序题。这个顺序如果你只看过概念会很容易把PostConstruct和afterPropertiesSet搞混。我按照当时复习的记忆整理出正确的顺序实例化构造器属性填充Autowired依赖注入Aware回调BeanNameAware、BeanFactoryAware等BeanPostProcessor的postProcessBeforeInitialization执行PostConstruct执行afterPropertiesSet执行自定义init-methodBeanPostProcessor的postProcessAfterInitialization使用BeanPreDestroy和destroy-method这道题考得很细但如果你自己手写过BeanPostProcessor或者排查过一个Spring启动时初始化顺序问题其实是能反推出来的。PostConstruct在依赖注入完成之后、AOP代理生成之前这个顺序很符合直觉。我建议备考时不要死记硬背而是打开Spring源码看看AbstractAutowireCapableBeanFactory的initializeBean方法看一遍之后这辈子都忘不了。4.2 Redis、MQ等中间件的常见切入角度中间件考题主要围绕Redis和消息队列。Redis那道题我记得是问“缓存与数据库双写一致性时先删缓存再更新数据库会导致什么问题”。答案是会出现短暂的不一致线程A删了缓存还没来得及更新数据库线程B读到了数据库里的旧值写回缓存之后线程A才更新数据库导致缓存和数据库长期不一致。这种问题在笔试里非常喜欢出因为它既考了缓存更新的常见套路又考察你能否分析并发下的时序问题。解法通常是延时双删先删缓存更新数据库过几百毫秒再删一次缓存。这个方法在工程上简单有效笔试里写出来也是标准答案。MQ相关的题则偏向基础概念比如“如何保证消息不丢失”。这其实是三个环节的事生产者端要开启confirm模式确保消息投递到BrokerBroker端要开启持久化把消息刷盘归档消费者端要手动ack保证处理成功后才确认消费。三个环节缺一个都不算完全可靠选择题里会把场景写成“消费者收到消息后立即ack然后处理失败”问你会不会丢消息——答案当然是会。4.3 框架选择题的“排除法”策略说实话Spring和中间件的多选题难度不低因为选项里经常混着一两个“看起来对但实际错误”的伪命题。比如“Spring AOP只能拦截public方法”这个选项是对的“CGLIB代理可以代理final类”是错的“Spring事务默认的传播行为是REQUIRED”是对的“事务只在抛出RuntimeException时才回滚”是错的它只对RuntimeException和Error回滚受检异常默认不回滚。面对这种题我的策略是先把100%确定的正确项选出来再把100%确定的错误项排除掉剩下模糊的选项宁可少选也别多选。因为本科笔试的多选题很多是“少选得部分分错选不得分”追求满分反而容易翻车。这个策略帮我保住了至少2道多选的分数非常实用。5. 编程范式、线上答题与心态管理表面考代码实际考工程素养5.1 异步编程怎么成为笔试新宠2023年有个明显趋势笔试开始把“异步编程”“CompletableFuture”这类工程概念搬进选择题。我当时就遇到一道场景题一个下单接口需要调用库存服务、优惠券服务、积分服务串行调用总耗时500ms要求改成并行调用问用哪个API合适。选项里有CompletableFuture.allOf、CompletableFuture.join、FutureTask.get、Thread.sleep。答案是allOf加join。allOf的含义是等待所有异步任务完成适合这种“多任务并行最后汇总”的场景。join()则是在主线程里阻塞等待结果用法上等价于get()但不需要处理受检异常笔试里更推荐写这个。这里我再补充一个高频变形如果三个服务里有一个失败需要做兜底那就不是allOf而是要用exceptionally或handle对每个future单独处理异常。热词里提到的“CompletableFuture异步编程异常处理”就是这个点。笔试如果出代码补全题大概率会要求你在thenApply和exceptionally之间做选择核心逻辑就是正常人写业务代码的思路先正常处理再兜底异常。5.2 调试与自测的有限时间分配编程题做完了不代表结束一定要留时间自己造测试用例。第二道编程题我记得是跟“MapReduce”思路沾边的矩阵或统计类题目具体题目现在回忆不全了但我清楚记得自己当时构造了一组边界输入去验证比如窗口数M大于顾客数N、所有顾客时间相等、N1这些极端情况。说到调试技巧ACM模式下一个很好用的习惯是写代码之前先在注释里把思路写清楚再动手敲。这一步有两个好处一是能防止写到一半思路混乱二是如果代码没跑通回看注释能快速定位逻辑偏差。我当时甚至会在代码里直接打印中间结果来验证贪心过程确认无误后再删除打印语句。另外在线笔试平台对代码运行时间是有限制的一般是C 1秒、Java 2秒。如果你的算法复杂度是O(N^2)而N是10万那大概率超时。我平时练习就习惯每次提交后看一眼时间排名强迫自己写出更优解而不是“能过就行”。5.3 从春招笔试反推校招备考节奏走到这一步你会发现笔试其实是一场“知识广度熟练度心态”的综合测试。2023年春招的备考节奏我复盘下来有三个要点第一算法不能只刷LeetCode要配合牛客网的ACM模式练习。输入输出这一道坎不提前跨过去考场就会手忙脚乱。第二Java后端的基础题必须系统过一遍尤其是并发、JVM、Spring、MySQL、Redis这五座大山。选择题考的是“你有没有真正理解”光背面试题集是不够的最好能自己画一画线程池执行流程图、Bean生命周期时序图、InnoDB索引结构图。第三编程范式方面异步编程、函数式编程不再是加分项而是基础项至少要把CompletableFuture、Stream API的常用操作练熟。我个人在春招笔试结束后的感觉是线上答题比现场面试更考验基本功的扎实程度。面试你可以靠沟通技巧圆过去但笔试是黑白分明的对就是对错就是错没有任何糊弄空间。所以每一次笔试哪怕没通过也值得认真复盘把错题背后的知识点吃透。我当时专门建了一个文档记录每场笔试的错题按知识点分类后面复习时直接看自己的错题集比看任何别人整理的资料都高效。最后再分享一个小经验笔试时不要追求把每道题都做对而是先做有把握的题把能拿的分全部锁进兜里。编程题如果第二题一时没有思路先把第一题AC掉然后回来啃第二题哪怕只过部分测试用例也比直接放弃强。只要把握住这个原则你的笔试成绩一定不会差到哪里去。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号