
1. 一份2017年的笔试卷现在翻出来还能学什么先说说我为什么会盯上这份2017年的PayPal暑期实习生笔试卷。众所周知技术面试的形态这几年变化其实很大——远程协作面试普及了、做题平台从白板换成了在线IDE、有些公司甚至开始用AI辅助评判代码风格。但我这两年帮学弟学妹做模拟面试和简历辅导时发现一个有意思的现象头部外企的实习笔试考来考去还是那几板斧。数据结构与算法、语言基础、系统设计思维、还有一点计算机底层常识。2017年的PayPal笔试卷恰恰是这套考察逻辑的典型样本——份量不大但覆盖面很广难度不算变态但每一题都能筛掉一批人。这份卷子对应的是软件工程师A卷面向暑期实习生岗位。放到今天来看它依然能告诉我们三件事第一PayPal这类外资支付公司在筛选实习生时最看重哪些硬技能第二笔试题目背后的考点权重怎么分布复习时应该把时间花在哪儿第三从笔试到面试之间简历和项目经历要怎么配合才能让面试官觉得你不只是会做题。这篇文章适合正在准备外企暑期实习笔试的同学尤其是目标岗位是后端、全栈或者通用软件工程师方向的。如果你已经刷了不少LeetCode但总觉得做题和笔试是两回事那这篇文章应该能帮你把中间那层窗户纸捅破。我尽量把考点拆细也会聊一些从实际笔试和面试中总结出来的准备策略——不是让你背答案而是让你知道该往哪个方向使劲。顺便说一句近两年我注意到一个现象——很多同学搜索嵌入式软件工程师相关的笔试和面试题也会顺手搜到PayPal这类公司的软件工程师笔试卷。这两个方向确实有交集底层的数据结构和编程能力是通用的但考察重心有明显差异。我在后面也会单独讲讲这个给准备嵌入式方向的同学一个对照参考。2. 应试前先搞明白这类笔试真正筛的是哪三种能力2.1 第一层算法与数据结构——半小时内写出可运行的解法不管是PayPal的暑期实习生笔试还是其他头部外企的软件工程师A卷/B卷算法题从来都是绝对的主角。这个主角地位不是没道理的——它是最容易标准化、最不容易被背答案糊弄过去的考察维度。但很多人对算法笔试的理解有个偏差以为考的是谁会解难题。实际上实习生的算法笔试几乎不考脑筋急转弯式的高难算法。它更看重的是你有没有养成一套标准化的解题流程拿到题目后能不能快速判断出题人想考哪个数据结构、能不能在两三分钟内把暴力解法的思路理出来、能不能在半小时内写出边界条件处理干净的可运行代码、能不能顺手分析时间复杂度和空间复杂度。我见过太多同学在剑指 Offer 和 LeetCode 上刷了三四百题一上笔试还是翻车。原因就是他们习惯了看题——想不出——看题解——背下来的模式从来没有在限时和不能看答案的环境下独立写过代码。笔试现场没有提示没有讨论区也没有人告诉你这道题用DFS还是BFS。你平时怎么练的考试就怎么发挥这句话在笔试上体现得淋漓尽致。2.2 第二层语言与工程基础——不用查文档也能答对的常识笔试的第二类题目是语言和工程基础题。这类题不像算法题那样占据大头但它往往是软性筛人的关键——算法题大家都能写个差不多语言基础题却能把刷题型选手和真写过东西的人区分开。PayPal 的软件工程师笔试卷里这类题通常表现为几种形态给你一段代码让你判断输出、给你一个概念让你选择最准确的描述、或者给你一个实际开发中的场景让你判断哪个方案更合理。考察的语言范围一般集中在 Java、Python、C 这三种主流语言上有时候也会涉及 JavaScript 和 SQL。为什么我强调不用查文档也能答对这个标准因为笔试环境里你是拿不到IDE提示和文档的。一个合格的软件工程师对自己主力语言的核心语法和常用库应该是形成肌肉记忆的——就像你写中文不需要查字典一样。如果你连 list 和 dict 的常用方法都要犹豫连 Java 里 HashMap 的底层结构都说不清楚那笔试分数一定不会好看。2.3 第三层系统设计思维——小公司很少考、大厂几乎必考的部分很多人以为只有面试才有系统设计题笔试不会考。实际上很多外企的实习生笔试已经开始加入轻量级系统设计题了。只不过它的形态和面试时的系统设计不一样——笔试里不会有设计一个Twitter这种两小时的大题更多是让你在一个具体场景下做技术选型、画数据表结构、或者解释某个架构决策的合理性。这一层能力恰恰是很多刷题型选手的盲区。算法题练得再熟如果你不懂数据库索引的基本原理、不了解缓存和消息队列在什么场景下该用、不知道怎么设计一张符合业务需求的数据表那遇到这类题就只能瞎蒙。我之后会专门用一个章节来分析系统设计题的答题框架这里先不展开。你只需要记住一个结论如果你想进的是像PayPal这样业务复杂度高的公司笔试题里出现设计一个支付账单模块或者设计一个用户通知系统这类场景题的概率非常高。这跟公司业务强相关——支付系统天然就是分布式、高并发、强一致性的经典场景校招笔试拿它做背景再正常不过。3. 算法与数据结构命中率最高的复习区间按权重排序3.1 数组、字符串、哈希表性价比最高的三件套如果说笔试算法题有一个必考清单排在第一梯队的绝对是数组、字符串和哈希表。数组和字符串是最基础的数据结构几乎没有任何一道算法题能完全绕开它们。笔试里常见考法包括双指针遍历、滑动窗口、前缀和、区间合并、字符串匹配、字符串与数字的互相转换等等。这类题目的难度一般控制在中等偏下但非常考验代码实现的准确度——思路大家都懂但能不能在边界条件上不出错才是拉分的关键。举个例子一道看起来很简单的题给定一个字符串找出不含重复字符的最长子串长度。如果你用滑动窗口来做需要考虑的事情其实不少窗口的左边界什么时候收缩、用什么数据结构记录窗口内字符的出现情况、时间复杂度能不能压到O(n)。这种题不会难倒你但如果你写过十遍还是每次都要重新推导边界条件那说明基础还没练到位。哈希表在算法笔试中的定位是万金油工具。很多题目的暴力解法是O(n²)但如果你能用哈希表把查找操作的时间降到O(1)整个算法就能优化到O(n)。两数之和、字母异位词分组、最长连续序列这些经典题核心思路都是哈希表。我给你的建议是刷题时看到一个题目第一反应可以是暴力解但提交前一定要问自己一句能不能用哈希表优化——笔试批卷时O(n²)和O(n)的差距是很明显的。3.2 链表与栈队列边界条件是丢分重灾区链表题在笔试中的出现频率不低但它跟数组题有个显著区别链表题的代码量不大但边界条件和指针操作的细节极多稍不留神就写成bug。典型的链表考点包括反转链表整个反转、区间反转、K个一组反转、合并两个有序链表、链表环的检测、找链表倒数第K个节点、删除链表中的重复节点等等。这些题考察的核心就两件事一是你对指针/引用的理解是不是透彻二是你在空指针链表长度为1头节点被修改这些边界情况下能不能保持清醒。我自己带过的学生里至少有三分之一的人写反转链表时会把 next 指针弄丢。这个问题怎么破没有捷径只能靠多写。写的时候养成一个习惯每次修改指针前先确认还有没有变量能访问到后续节点。这是我在实际调试中总结出的一个非常好用的自查方法。栈和队列的考法更偏向用对工具。括号匹配、表达式求值、单调栈解决更大元素/更小元素问题、用两个栈实现队列、用队列实现栈——这些都是笔试常客。重点不是背题而是理解栈适合解决具有后进先出特性LIFO的问题队列适合解决先进先出特性FIFO的问题这个核心逻辑。想通这一点遇到变形题你也能举一反三。3.3 树与图二叉树遍历必须形成肌肉记忆树这块二叉树的各类遍历是绝对的笔试核心。前序、中序、后序、层序递归版本大家都会写但迭代版本呢Morris遍历呢很多笔试会直接要求用迭代方式实现二叉树的中序遍历——这个要求本身就说明他们不希望看到你只会套递归模板。为什么这么关注遍历因为树的很多进阶题都是在遍历的基础上加一层逻辑二叉树的最大深度、最近公共祖先、二叉树展开为链表、验证二叉搜索树、路径总和、二叉树的右视图——全是遍历的变体。你如果能把三种遍历的递归和迭代写法都练成肌肉记忆树这块的题你就解决了一大半。图相关的题目在实习生笔试里出现频率比树低一些但一旦出现就是拉分题。常见考法有岛屿数量DFS/BFS的经典应用、拓扑排序课程表问题、最短路径Dijkstra算法、并查集连通分量问题。我建议你不需要把图论的所有算法都啃一遍但DFS和BFS一定要能手写出来——它们在图和树的题目中都是核心工具。3.4 动态规划与贪心中等难度足够别陷进偏题怪题动态规划是很多同学最头疼的部分因为它没有固定的代码模板每一道题都有自己独特的转移方程。但就实习笔试而言动态规划的考察难度不会太高——最多到中等这个档位。常见题型包括爬楼梯、打家劫舍、最长递增子序列、最长公共子序列、编辑距离、背包问题01背包和完全背包的简单版本。准备动态规划的正确姿势是什么我的经验是不要一上来就刷难题先把状态定义这件事练明白。动态规划的难点从来不在递推公式而在于你想不想得到用状态数组来表达这个问题。你拿到一道题如果能快速定义出dp[i]表示什么含义那转移方程其实水到渠成。反过来如果你连dp数组的含义都想不清楚后面全是白搭。贪心算法在笔试中通常是作为一道独立题出现而且往往放在中后段区分度比较高。经典题型包括区间调度无重叠区间、跳跃游戏、分发饼干、加油站等。贪心题的特点是你一旦想到正确的贪心策略代码写起来极短但如果你没想到就会觉得怎么都不对。这部分的准备方法只能靠多见识题型积累多了自然就能形成这个题可能是贪心的直觉。3.5 如果你面的是嵌入式方向的软件工程师这里要额外注意我前面提到过很多同学搜PayPal笔试的同时也在搜嵌入式软件工程师的面试题——这两个岗位的笔试差异值得单独说一说。通用软件工程师的算法题更偏数据结构与算法本身而嵌入式软件工程师的笔试题会更强调内存布局、指针操作、位运算、大小端、栈溢出、volatile关键字、中断处理这些跟硬件强相关的内容。举个例子同样的反转链表题目通用岗可能用Java写就行嵌入式岗可能会要求你用C语言实现并额外问一句如果链表节点定义里有个指针指向只读内存你的反转函数要怎么处理。我的建议是如果你目标明确是嵌入式方向学习数据结构时尽量用C语言去刷题。这样既能练算法思路又能顺便巩固指针和内存管理的功底。如果两个方向都想投那就以Java/Python刷算法题为主另外单独把C语言和操作系统的核心概念过一遍——别贪多但每一个方向都要有最基本的储备。4. 系统设计与面向对象容易丢分但可以提前练的板块4.1 设计一个类比很多同学想象中更常出现面向对象设计题在实习生笔试里出现频率其实挺高的只是很多同学没意识到它是系统设计的一种前置考察。它跟系统设计题的区别在于面向对象设计题聚焦在如何设计一组类来建模某个业务场景考察的是封装、继承、多态这些基本功。举个例子笔试里可能出现这样的题请设计一个停车场系统支持多种车型按不同费率计费要求可以方便地添加新车型。这种题看似简单但不同水平的答案差距很大。只会把数据结构和基本逻辑写出来的同学通常会用一个大的if-else链来处理车型判断而设计功底好的同学会想到用策略模式把计费逻辑抽出来用工厂模式来创建不同类型的车辆对象——代码的扩展性和可维护性完全不一样。再举一个形式给你一段设计得不太好的代码让你指出问题并重构。这种题考察的是代码味道的识别能力方法是否过长、类是否承担了太多职责、有没有重复代码、有没有把不该暴露的字段暴露出去。这块能力没有速成办法只能通过读好代码、写代码、再回头看自己的代码来慢慢建立。对于这类题我有一个特别实用的答题框架叫做三步走第一先识别出这个场景里有哪几个核心对象第二明确每个对象有哪些属性和行为第三考虑对象之间是什么关系继承、组合、依赖。你按这个顺序去设计类至少能保证结构清晰不会漏掉关键要素。4.2 系统设计题在小笔试中的出现方式系统设计题在笔试里怎么可能出现毕竟时间有限不可能让你画架构图、写完整设计文档。所以笔试中的系统设计题通常被压缩成两类形态。第一类是模块设计题给你一个具体业务场景让你设计数据表结构、定义接口、说明核心流程。比如设计一个电商订单模块的数据表结构要求支持订单状态流转——这种题的考法很像后端开发的实际工作需要你懂一点数据库设计规范、懂一点业务建模。第二类是架构选型题给你一个系统场景列出几个技术方案让你选择并说明理由。比如一个支付系统需要支持高并发写入你会选择关系型数据库主从架构、分库分表还是引入消息队列做异步削峰请说明理由。这种题没有标准答案但你需要展现出权衡利弊的思考方式——每个方案都有优缺点重要的是你能否结合业务场景做出合理判断并解释清楚你的取舍依据。这两类题对于只刷算法题的学生来说确实棘手。我的建议是平时学习后端知识时不要只停留在知道某个中间件是干嘛的层面多问自己一句这个组件在什么场景下用、解决了什么问题、带来了什么新问题。这种思维方式一旦形成应付笔试里的场景题会轻松很多。4.3 从能跑到可扩展的答案提升路径面试官到底期待什么样的答案我观察下来从低到高可以分成三个层次第一层是功能正确。你的设计能跑通基本流程数据表能存数据接口能返回正确结果。这是及格线。第二层是考虑边界。你主动考虑了异常情况——比如库存不足怎么办、并发下怎么避免超卖、支付回调超时怎么处理。能想到这一层说明你具备一定的工程经验或阅读过相关实践。第三层是可扩展、可维护。你设计的模块是否方便增加新功能数据表结构是否留下了扩展余地接口的返回值是否统一规范系统之间的依赖关系是否清晰能稳定做到这一层已经接近社招工程师的思考水平了。在校招和实习的笔试中绝大多数人只能做到第一层有三分之一的人能做到第二层能做到第三层的人凤毛麟角。所以在笔试作答时哪怕你对自己的方案不是100%确定也一定要在答案里补充异常情况怎么处理未来如果需求变化怎么扩展这两段。这不需要你有多深厚的经验只需要你在平时做题时有意识地去练习这种思维方式。别小看这两段话它可能比你的功能设计本身更让面试官眼前一亮。5. 简历筛与笔试的隐藏连接线工程素养怎么提前储备5.1 笔试不是从开考那一刻才开始的很多同学把笔试理解成开考那一刻才开始这是很大的误区。笔试的本质是你在过去一年里学到的东西的抽样检验——刷题的积累、项目的实践经验、对计算机基础知识的理解深度这些都会在试卷上体现出来。但这里有一条很多人没意识到的隐性规则笔试成绩和简历是联动评估的。当你的笔试成绩处在及格线边缘时面试官会翻出你的简历来看——如果简历上有跟公司业务匹配的项目经历成绩可能会被加权如果简历空空如也那笔试就是你唯一的救命稻草。所以我给所有准备实习的同学一个建议投递之前先把自己的简历全面升级一遍。哪怕只是做课程设计或实验室项目也比简历上什么都没有强得多。项目不一定要多高大上但一定要能讲清楚三件事项目解决什么问题、你负责什么模块、你从中学到了什么技术。尤其是对于PayPal这样的支付公司如果你的项目跟订单系统支付流程对账逻辑沾边哪怕只是用Spring Boot写了个简单的Demo也一定把它写上去。5.2 计算机网络、操作系统、数据库外企笔试的抢分暗线除了算法题和系统设计题笔试中还有一批重量级但容易被忽略的题目——计算机基础知识题。这部分在2017年PayPal那张A卷里同样存在而且占比不低。计算机网络最爱考的是TCP三次握手和四次挥手、TCP和UDP的区别、HTTP状态码的含义、HTTPS的握手过程、DNS解析流程。这些知识点不难但很多同学都是一知半解答的时候模棱两可。我推荐一个复习方法假装你要给一个完全不懂技术的人讲清楚这些概念看你能不能做到。如果你自己讲的时候发现逻辑不自洽那就是没学透。操作系统爱考的是进程和线程的区别、死锁的四个必要条件、虚拟内存和分页机制、进程间通信方式。数据库则爱考索引为什么能加速查询B树结构、事务的ACID特性、隔离级别、什么时候该用索引什么时候不该用。这些题纯粹是背多分——只要你复习过基本能答对但如果你没复习可能连题目在问什么都不知道。我给这部分定的优先级是计算机网络 数据库 操作系统。不是操作系统不重要而是笔试里前两者的出现频率通常更高。如果你是时间有限的在校生先从计算机网络和数据库开始复习收益是最高的。5.3 国际化团队对英语能力的隐性要求PayPal是一家总部在美国的跨国公司英语能力在笔试和面试中的重要性被很多人低估了。我见过笔试题目本身是全英文的情况也见过一些同学因为看题速度慢导致做不完。所以如果你希望面试官对你有好印象至少要保证能流畅阅读英文技术文档、能看懂英文题目的描述、能准确地用英文回答技术问题。不用紧张这个要求不高。你不一定需要英语特别流利但基本的沟通能力一定要有。如果你的英语基础比较薄弱建议在笔试前一个月开始每天花半小时阅读英文技术博客——既是练英语也是学技术一举两得。别拖到考前一天才临时抱佛脚英语这个东西真的是慢功夫。6. 暑假实习的完整时间线从投递到接offer的关键节点6.1 提前一年的准备节奏很多同学会问我该从什么时候开始准备暑期实习我的回答是越早越好但至少提前一年开始。如果你现在是大学二年级下学期或者三年级上学期准备明年暑假的实习那你的时间安排大致是这样的第1-3个月基础期确定你的主力语言Java/Python/C三选一把语言基础过一遍。同时开始刷LeetCode每天1-2道先做简单题。第4-6个月进阶期进入中等题的训练优先覆盖我前面列出的高频考点——数组、字符串、哈希表、链表、二叉树、动态规划。这个阶段同时开始复习计算机网络和数据库的基础知识。第7-9个月项目期做一个拿得出手的项目。项目不用大但一定要能让你对软件开发这件事产生真实的体感——遇到bug要自己解决、部署要自己搞定、代码要自己组织。这个体感是刷题给不了你的。第10-12个月冲刺期开始投简历做模拟笔试复盘错题针对目标公司的业务特点做定向准备。这个时间线看起来很漫长但对于一个零基础的学生来说真要按这个节奏走完已经挺紧凑了。如果你已经晚了也别慌——晚开始但高强度的投入比早开始但三天打鱼两天晒网强得多。重要的是从今天开始行动。6.2 投递窗口与笔面试流程外企暑期实习的投递窗口通常在前一年的秋季就开启了。别等到春季开学才投——很多公司到那时候已经在发offer了。以PayPal这类外企为例流程一般是网申 → 简历筛选 → 在线笔试 → 技术面试2-3轮→ HR面试 → 发放offer。笔试通常是第一道硬门槛一次笔试成绩的好坏可能直接决定你能不能进入面试环节所以它值得你花最多的时间去准备。在线笔试的环境和平时刷题是有差异的——你需要在一个独立的网页上写代码没有本地IDE的代码补全、不能编译调试有的平台可以编译但看不到完整报错信息。所以一定要提前做1-2次模拟笔试适应这种裸写代码的感觉。我见过不少平时刷题表现很好的同学因为不适应在线评测环境而在笔试中发挥失常真的非常可惜。另外做笔试时有一个实用技巧先扫一遍所有题目按分值和时间分配做好取舍。遇到卡壳超过10分钟的题果断先跳过把后面能拿的分拿到手。毕竟笔试的目标是总分最大化不是每道题都得满分。6.3 笔试后的复盘方式笔试结束不代表这个过程就结束了——复盘才是真正让你进步的关键环节。笔试后的复盘该怎么做我的建议是遵循这三个步骤第一步把每道题重新做一遍确保这次是在没有任何帮助的情况下独立做出来的第二步写下每道题对应的考点和你的解法思路整理成一个错题本第三步也是最容易忽略的一步——分析你做错或没做出来的原因。是知识点没学过还是学过但不会用是代码写得太慢还是题目没理解透把原因归类才能有针对性地补强。我有个学生第一次模拟笔试只考了45分满分100他按这个复盘方法改了三个月第三次模拟考拿到了88分。他的原话我印象很深笔试和考试最大的区别不是题目难度而是你有没有一个清晰的能力地图。当你清楚自己哪里会、哪里不会、哪些题需要优先拿分的时候考场上的心态是完全不一样的。这让我想多说一句笔试这个东西确实可以通过大量练习来提升但它不是刷题越多分数越高的线性关系。关键在于每一次练习之后你是否真正理解了这道题的考点、是否沉淀出了自己的解题方法论。重复做一千道题而不总结远不如精做三百道题然后充分复盘。这个道理放在任何技术面试准备上都是通的。写到最后我想起自己做技术面试官时的一种感受。其实面试官并不期待每个候选人都能从笔试一路所向披靡更看重的是你在笔试中展现出的思维方式和学习能力。就算某道题没做出来如果你在试卷上写出了部分思路、或者用注释说明了自己的思考过程面试官是看得出来的。所以我建议各位在笔试时尽量不要留白——把能想到的都写上去哪怕只是思路也可能成为你进入下一轮的敲门砖。这是我见过太多真实案例之后得出的体会希望对你有用。