
前阵子整理旧电脑里的文件翻出了当年手抄的一道道实习笔试题解析其中印象最深的就是那份标注着“二”的卷子。之所以对它印象深是因为它和第一份试卷的风格差异实在太大了——如果说“一”考的是“你学过没有”那“二”考的就是“你究竟会不会用”。很多同学做第一套的时候还觉得挺顺手到第二套一打开就傻眼题型突变、分值结构不一样、开放题占比高整个节奏完全被打乱。这篇文章不是原题复述而是基于当年那批暑期实习生笔试的复盘第二套卷子到底在考什么、哪些知识点反复出现、以及什么样的答题策略能让你少丢分。不管你是准备实习笔试还是已经考完想复盘这篇内容都值得你花十分钟读完。1. “二”不是“一”的补考一份系列笔试卷背后的分工逻辑1.1 为什么笔试要拆成两套卷子先说一个很多人忽略的事实一套系列笔试题之所以分成“一”“二”不是因为题目太多装不下而是招聘方有意做了筛选分层。“一”承担的是基础面筛选题量大、范围广计算机基础、网络、操作系统、数据库、语言语法全覆盖目的是快速过滤掉基础不牢的候选人。它的难度不会太高但特别“碎”做起来像在跑一场知识马拉松。“二”则完全是另一种物种——编程题、分析题、开放设计题集中出现单题分值高考察的是你把知识落到代码和方案上的能力。从招聘流程讲一次线下笔试时间有限通常90到120分钟不可能既考广度又考深度。拆成两套第一套快速筛掉一部分人第二套从剩下的人里精挑细选。站在候选人角度这意味着一个很残酷的事实第一套过得了第二套该挂还是挂只刷基础不练代码或者只练代码不看基础都会在某个环节翻车。1.2 “二”的分数权重远比你想的高不少公司对两套卷子的评分处理方式不一样有的直接按比例折算总分有的把“二”作为是否进入面试的关键一票。我见过不少同学“一”接近满分、“二”惨不忍睹最后总分被强行拉回来的真实案例。原因也说得通实习生进来是要干活的基础差可以慢慢补但代码能力、逻辑思维、解决问题的习惯短时间很难速成。“二”考的就是这些“短时间提不上去”的能力所以它在筛选环节里的话语权更大。你备考的时候也要把七八成精力花在“二”可能出现的题目类型上而不是抱着“一”的真题集猛刷。1.3 别用做“一”的思维做“二”这是我当年踩过最大的坑。做“一”的时候我的策略是快速抢分选择题不会的跳过会的赶紧选完最后留时间检查。这个策略放到“二”上完全失效——这套卷子的大题多、步骤多、推导多不是“会就选”那样轻量。“二”的每道大题都是一个完整的思考过程读题、拆条件、选方案、写实现、验边界、写复杂度。一旦你试图用“抢时间”的思路去做很容易把题目条件看漏或者在一道题上写一半发现思路错了卷面改得乱七八糟。记住这套卷子考的从来不是手速是稳定输出。2. 题型拆解第二卷的主流套路与应对顺序2.1 高频题型分布一览以当年多套实习生笔试第二卷的题目结构来看题型通常集中在以下几类占比会因岗位方向不同有偏移但大骨架很稳定题型常见分值占比考察能力典型形式基础选择/填空20%-30%知识储备是否成体系代码阅读题、概念辨析手写代码题30%-40%代码基本功与边界意识链表、二叉树、字符串操作分析/改错题15%-20%定位问题与排查能力给一段代码问问题在哪、怎么改开放设计题15%-25%结构化的方案思考能力短链接、缓存设计、功能改进注意这里“基础选择/填空”出现的题目跟“一”不一样——它很少直接考“TCP三次握手是几步”这种背诵型题目更多是给一段代码问你输出什么、某个Java集合在某个操作后变成什么样子。它默认你已经通过了“一”的基础筛选所以这部分的题目是带陷阱的做的时候要多留个心眼。2.2 拿到卷子先花三分钟做这件事不要急着动笔。我推荐的做题顺序是三步走通读全卷把每道题的分值标出来同时用自己熟悉的符号标记“会做”“需要想想”“完全没思路”。按“会做优先、高分优先、短时优先”的次序做题先把稳拿的分装进口袋。留到最后处理的一定是开放题和完全陌生的题目——这类题不追求一步到位只要有思路框架就能拿分。有人会觉得“开放题我会啊先做不行吗”除非你思路非常清晰否则不建议。开放题很容易一写就停不下来写完才发现前面20分的代码题没时间做了得不偿失。2.3 遇到陌生题的正确姿势“二”一定会出现你没见过的题这是出题人故意留的观察窗口。他看的不是你“会不会”这道题而是你遇到不会的题时“怎么反应”。我见过太多同学遇到一道陌生题就整段空白或者乱写几句。其实阅卷是按采分点给分的你写代码题的解题思路、画一个输入输出的例子、列出需要考虑的边界条件都能拿分空着和乱写都是零分但写思路可能拿30%-50%的分。哪怕是开放题你写“这个方案考虑了三个维度成本、延迟、可用性其中成本方面我这样想……”也比完全空白强。阅卷人看到的是你的思维是否有序而不是你“是否给出了标准答案”。3. 高频考点精讲Java、数据结构与逻辑题的三块硬骨头3.1 Java基础反复考察的几个底层点为什么第二卷喜欢考这些Java底层细节因为出题人想知道你写代码的时候是“调API型选手”还是“理解原理型选手”。理解原理的人排查问题能力和自学能力通常更强。先看集合类HashMap是绝对的常客。它至少要掌握到这种程度// JDK 8 中的 put 流程简化版 int hash hash(key); int index (table.length - 1) hash; // 如果 table[index] 为 null直接放进去 // 如果 table[index] 不为 null遍历链表找相同 key // 链表达不到8个节点就尾插 // 链表节点数 8 且 table.length 64 时转红黑树 // 数组大小超过阈值capacity * loadFactor时扩容笔试里常问的变体有为什么HashMap线程不安全ConcurrentHashMap在JDK7和JDK8分别怎么实现线程安全这些如果只看过概念写代码题时很容易露馅。ArrayList的扩容机制也是高频题默认容量是10每次扩容到原来的1.5倍底层是Arrays.copyOf。看着简单但有一道经典变形题循环往ArrayList里添加100万个元素会发生多少次扩容算一下就知道答案是“约20次左右”每次扩容1.5倍的指数增长这种题就是在考你懂不懂底层。equals与hashCode的契约同样必考。重写equals却不重写hashCode会导致什么后果HashMap里的对象get不到HashSet出现重复元素。笔试喜欢给一个只重写了equals的类让你判断两个对象放入HashSet后的size是多少。3.2 JVM与并发代码题背后的隐含考点手写代码题很少直接考“JVM内存模型画出来”但它会通过另一种方式出现给一段不断创建对象的代码问会不会OOM或者给一段多线程访问共享变量的代码问哪里有问题。JVM内存区域要先搞清楚堆、虚拟机栈、方法区、程序计数器、本地方法栈各自的角色。GC部分重点是可达性分析和GC Roots以及复制算法、标记清除、标记整理三种回收算法的差别。并发的考察更偏向代码实操线程池参数是高频中的高频new ThreadPoolExecutor( corePoolSize, // 核心线程数 maximumPoolSize, // 最大线程数 keepAliveTime, // 非核心线程空闲存活时间 TimeUnit.SECONDS, new ArrayBlockingQueue(100), // 任务队列 Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 );它经常会这么问corePoolSize5、maxPoolSize10、队列容量100此时同时提交120个任务最后会有多少个任务被拒绝算一下就明白了5个核心线程会被占用100个任务进队列剩下15个创建非核心线程执行最大还能创建5个所以最终被拒绝的任务是10个。这种计算题考的不是背诵是真的理解线程池的工作流程。3.3 数据结构与算法三个核心类型的速通方案我在整套模拟里总结出三组笔试代码题中最常出现的类型分别说。第一类是链表操作。反转链表、合并两个有序链表、判断链表是否有环这三道是“母题级”的存在。// 反转链表非递归版本 public ListNode reverseList(ListNode head) { ListNode prev null; ListNode curr head; while (curr ! null) { ListNode nextTemp curr.next; curr.next prev; prev curr; curr nextTemp; } return prev; }笔试考你的东西非常直接会不会写循环、是否记得保存next节点、空链表和单节点链表能不能过。这几个就是采分点。第二类是二叉树。前中后序遍历必须会手写递归版和非递归版层序遍历用队列这个不用商量。镜像二叉树、最大深度、路径和这些题目也建议提前练熟。二叉树题目的核心技巧是“先想递归终止条件”你把这个写对了一半的分基本拿到了。第三类是排序与二分。排序算法的稳定性、时间复杂度和空间复杂度要能秒答排序算法平均时间复杂度空间复杂度稳定性冒泡O(n²)O(1)稳定快速O(n log n)O(log n)不稳定归并O(n log n)O(n)稳定堆排O(n log n)O(1)不稳定二分查找的代码看起来简单笔试里经常让你写“查找第一个等于target的位置”这种变体非常容易在边界条件上翻车我建议考前亲手写三遍重点是区间边界是开是闭、循环条件是left right还是left right。3.4 逻辑题与概率题的答题范式“二”里出现赛马、抛硬币、鸡蛋掉落这类题的概率很高。很多人以为考的是智力其实考的是建模能力也就是“能不能把一个模糊问题抽象成有边界条件的数学模型”。统一答题框架是四步走明确条件题目给了什么约束、什么可变量。先看极端case规模为0、规模为1、规模为无穷大时结果分别是什么。建立模型把问题转成递推式、排列组合式或概率公式。推导通式并验证用小规模数据验证通式成立再往下写结论。举个例子一道经典的“100层楼2个鸡蛋找临界楼层”题如果直接凭感觉答“从10层开始试”大概率拿不到满分。但如果你写“设第一个鸡蛋每隔x层扔一次第二个鸡蛋逐层试总次数是x n/x通过均值不等式可得x≈√n时最优”即使数值不是标准答案阅卷人也会给你高分因为你看问题的结构是对的。4. 最容易被扣分的细节从卷面到边界条件的“隐形扣分点”4.1 手写代码的习惯分你别不在意很多人有一种错误想法笔试只对结果打分过程无所谓。但手写代码阅卷跟机器评测不一样它是人看的阅卷人会在极短时间里判断“这个人写的代码像不像能上线的代码”。我见过大量被扣“冤枉分”的卷面主要问题集中在四类一是不写边界条件。链表反转函数里没有判断head为null二分查找里目标值小于数组第一个元素时怎么返回字符串处理时输入是空串怎么办。这些不写阅卷人默认你考虑不周一到两个采分点没了。二是只写实现不写分析。题目要求“写出代码并说明复杂度”你写完代码不分析复杂度哪怕代码是对的这道题也拿不满。复杂度分析本身就是采分点千万别以为它是附赠题。三是变量命名完全没有可读性。ListNode a head; ListNode b a.next;这种写法看多了真的很崩溃。你写prev和curr阅卷人一眼就懂你写a和b他得停下来思考你指代什么。笔试本来就是争夺好印象的场景没必要在这种地方丢分。四是没有展示关键步骤。手写代码不像机器跑题你得让人知道你的思路。建议在代码上方写一行核心思路比如“用双指针快指针先走n步”必要时写出测试用例的输入输出。这就是你的复盘痕迹。4.2 审题环节这两个坑我见太多了第一个坑是输出格式看错。题目要求返回下标你返回值要求返回字符串你返回StringBuilder对象要求原地修改你又新建了数组。这种失误非常可惜因为它不是不会只是没看仔细。第二个坑是忽略题目里的约束条件。题目明明写了“数组已排序”你没注意到要求“不使用额外空间”你直接new了一个新数组。这些约束往往是出题人故意写出来让你走的捷径你一旦忽略解出来的答案要么超复杂度要求要么直接被判思路错误。审题这件事我不建议用“再仔细点”这种空话提醒自己。更有效的办法是动笔前先花20秒把题目里的关键条件圈出来用中文转述一遍——比如“这题是说有序数组去重并返回新长度”然后才开始写。这个过程能帮你过滤掉大半陷阱。4.3 时间分配失误一题卡住全盘皆输我在模拟中反复算过时间账如果一道15分的代码题卡了20分钟还没头绪果断跳过先做后面的25分大题这20分钟中的最后5分钟就是纯浪费。不要害怕跳过题目前面20分的题没写会被扣分但如果不跳后面25分大题也会没时间写那才是真的血亏。有一个实操技巧给自己定个“5分钟死线”。一道题超过5分钟没有清晰的思路先停下在草稿纸上草草记下已经想到的线索然后继续下一题。等把所有会做的题做完了再回头攻这些卡住过的题心态完全不一样。4.4 开放题的篇幅与结论开放题有个迷思——写得多等于分多。实际不是这样写得再多但没有结论阅卷人只会觉得你思维发散但缺乏决断力。开放题的正确打开方式是先给结论再给理由最后补充权衡。“我会优先选择Redis做缓存理由是它支持过期策略和持久化如果数据量超过单机内存再引入集群方案。这套方案牺牲了强一致性但换来了更低的延迟……”这样一个结构比洋洋洒洒写三大点但不说自己选哪个强得多。这本质上是在考察你的工程决策能力公司需要的不是脑子里有无数方案的人而是能在约束下做取舍的人。5. 站在出题人角度反推这场笔试到底在筛什么人5.1 笔试筛的不是“最聪明的人”而是“下限足够高的人”这句话是我后来自己也参与面试后才真正理解的。笔试不是竞技比赛它要筛的不是“最聪明”的而是“下限足够高”的。下限高体现在几个维度基础知识成体系、代码习惯好、遇到未知问题不会崩盘、做事有章法。笔试里的每一类题型都在检测其中一个维度。如果你只天赋异禀但基础薄弱选择题就漏给你看了如果基础不错但代码规范一塌糊涂手写代码题就原形毕露了。这个认知对你备考有很直接的指导意义——你不用追求每道题都做得惊艳而是追求“每道题都不犯低级错误”。稳定是你的首选策略惊艳是加分项不是必需品。5.2 笔试是面试的前置剧本大多数实习生不知道笔试卷子上的题目很可能就是面试开场的问题。面试官手边就摆着你的笔试卷他会从你答错的题、写了一半的代码、开放题的方案开始问“这道题你当时怎么想的”“如果再加一个条件你的方案还成立吗”这意味着你考完笔试不能就撒手不管。我当年养成的一个习惯是每场笔试结束趁记忆还热乎把每一道题复盘一遍写清楚“当时的思路”“正确的解法”“我漏掉的条件”三块内容。这个习惯直接让我在面试里拿到了主动权——因为面试官问我笔试里的题目时我已经把标准解法消化成自己的了。5.3 给正在准备实习的人三个可执行建议去年我带过几个小朋友准备实习笔试最终跑通全程的是这三个动作第一把“一二”两套卷子的复习分工做清楚。“一”看基础概念查漏补缺“二”专门练手写代码和开放题每周至少完整模拟一套“二”风格的卷子限时、手写、不查资料。第二所有手写代码题写完以后做三件事检查边界条件分析时间空间复杂度写下你的测试用例。刚开始会不习惯练半个月之后这些动作会变成肌肉记忆——而这恰恰是笔试中区分度最高的隐藏评分点。第三开放题不要只在脑子里想要动笔写“结论-理由-权衡”三段式。写出来你才会发现你想的方案和你能写清楚的方案完全是两回事。最后再分享一个小技巧考完这种卷子不管结果如何当天晚上一定把整张卷子在脑子里过一遍挑出一道你觉得最有收获的题整理成一篇几百字的“解题笔记”重点写两个内容这道题卡住我的核心障碍是什么以及下次遇到同类题我应该用什么思路先试。当年我把这个习惯坚持了整个求职季最后累积了几万字的错题复盘。那些笔记后来成了我进入职场初期解决真实问题的手边宝典。笔试这种东西考的是过去积累的知识但真正拉开差距的是你从每一次笔试里沉淀下来的反思能力。