趋势科技校招开发岗笔试题解析:从编程到基础这样复习稳

发布时间:2026/8/31 19:01:09
趋势科技校招开发岗笔试题解析:从编程到基础这样复习稳 前几天一个学弟发消息问我说手头拿到一份趋势科技2017年校招开发岗试题B想让我讲讲这套题怎么答、知识点怎么复习。他说现在开发岗笔试卷得很总觉得自己准备好了一看到卷子又慌。我看了下这套题倒是想起不少当年自己笔试和后来帮人改卷的细节。这份卷子虽然挂在2017年但说句实在话它的命题逻辑放在今天也并不过时。我今天就借着这套题把这类型笔试的考察重点、答题顺序、复习策略一次聊透。先说这套题适合谁看正在准备校招开发岗的同学、想进外企安全厂商的候选人、以及那些刷了很多LeetCode但觉得笔试还是答不完整的同行。这类卷子考察的东西其实很固定不管年份怎么变出题人想要验证的能力就那几样编程基本功、计算机基础知识的体系化程度、以及你在有限时间内的工程判断力。把这三点想明白复习方向就不会跑偏。1. 拿到这份卷子先别急着做题先看命题人的心思1.1 安全厂商开发岗的笔试为什么会长这样趋势科技是做什么的大家多少有数终端安全、网关安全、服务器防护面向企业客户的那一套安全产品线。这家公司的开发岗不是单纯写业务代码的岗位。写业务代码你只要懂框架、懂数据库、懂接口对接可能就够了。但安全产品的开发岗你面对的是底层系统、网络流量、文件格式、进程行为这些东西所以笔试考察的范围一定会往计算机基础上靠。这就解释了为什么这类卷子的题型覆盖面特别广从编程题到网络、操作系统、数据库、语言基础都有涉及。但它的深度并不会到竞赛级别出题人想确认的不是你会不会奇技淫巧而是你有没有把一个开发工程师该有的知识底子打牢。我把这类卷子常见的考察模块整理了一下基本逃不出这张表考察模块常见题型复习优先级编程题链表、二叉树、字符串、动态规划极高决定区分度计算机网络TCP/UDP、HTTP、DNS、三次握手高安全岗尤其看重操作系统进程线程、内存、死锁、调度高底层安全绕不开数据库SQL编写、索引、事务中高工程必需C/C/Java基础指针、内存、集合、并发高语言功底直接暴露逻辑与英语阅读理解、常识推理中外企常设置所以你看它不是那种只刷题就能过的考试但也不是需要你把整本《深入理解计算机系统》背下来的考试。它考的是体系不是孤点。1.2 这套B卷的整体印象与做题顺序说回这份2017年的B卷。我整体翻下来的第一感觉是题量不算吓人但每道题都踩在关键知识点上几乎没有送分题也没有纯偏题怪题。程序题部分占了较大比重基础题部分分布比较均匀属于那种你哪块没复习到马上就会露馅的卷子。我的建议是做题顺序上不要完全按题目顺序走。先把整张卷子从头到尾扫一遍花两三分钟判断题目的难度分布。通常的顺序策略是先做自己最有把握的题尤其是语言基础和简单编程题这些是稳拿的分然后做网络和操作系统这类需要记忆准确的知识点题最后集中火力攻编程大题和复杂的基础题。为什么要这么做因为笔试的时间是固定的但人的大脑状态是波动的。开头几分钟如果死磕一道难题后面会越来越慌连本来会做的题都可能出错。先把节奏稳住把确定能拿的分拿到手再谈挑战难题。2. 编程题链表、二叉树、字符串三类题目先拿下编程题就稳了一半2.1 链表高频题环、交点、反转画图比硬记管用校招笔试里的链表题翻来覆去就是那几道判断链表有没有环、找环的入口、找两个链表的交点、反转链表、合并两个有序链表。趋势科技的B卷里链表题出现的概率很高因为它能同时考察指针操作能力和数学推导能力。拿找链表环的入口这道题来说标准解法是快慢指针。第一步快指针每次走两步慢指针每次走一步如果两个指针相遇说明有环第二步让快指针回到头节点两个指针都改成每次走一步再次相遇的位置就是环入口。ListNode *detectCycle(ListNode *head) { ListNode *slow head, *fast head; while (fast fast-next) { slow slow-next; fast fast-next-next; if (slow fast) break; } if (!fast || !fast-next) return NULL; slow head; while (slow ! fast) { slow slow-next; fast fast-next; } return slow; }这里的关键是理解为什么第二步能定位到环入口。假设头节点到环入口的距离是D相遇点距离环入口是S环的长度是L。第一次相遇时慢指针走了DS快指针走了DSnL因为快指针速度是慢指针的两倍所以DSnL 2(DS)化简得到D nL - S。这个式子说明从相遇点继续走D步刚好走到环入口。所以让快指针从头开始和慢指针同速前进它们再相遇的位置一定是入口。我见过很多同学这道题背下来了但问一句为什么能相遇就卡住。笔试如果不只考写代码可能还会让你简单说说思路。把数学推导吃透反而比多刷十道题有用。2.2 二叉树和字符串题怎么答才不丢分二叉树这边层次遍历、前中后序遍历、最大深度、最近公共祖先这几道是常客。字符串这边反转字符串、最长回文子串、字符串匹配也经常出。我特别想提醒一点写树的题目时很多同学习惯直接写递归但忽略了递归的终止条件。比如求二叉树的最大深度代码看起来很简单int maxDepth(TreeNode *root) { if (!root) return 0; int left maxDepth(root-left); int right maxDepth(root-right); return (left right ? left : right) 1; }但你要知道递归函数每一步在做什么而不是只会套模板。面试官如果追问如果这棵树有十万层会怎样你要能说出递归栈溢出的风险以及怎么改成迭代方式。这类追问在安全厂商的面试里很常见因为他们平时处理的数据量和系统环境可能真的不允许你无脑递归。字符串题里最长回文子串是一个不错的练手题。最简单的思路是中心扩展法字符串的每个字符或者每两个字符之间的空隙都可以作为回文中心向两边扩展记录最长的长度。这个做法时间复杂度O(n²)空间复杂度O(n)面试场景下已经足够。不要一上来就写Manacher算法笔试时间有限能写出一个正确、清晰、易读的解法比炫技重要。2.3 动态规划和贪心校招要掌握到什么程度很多同学一听到动态规划就头疼觉得它是笔试里最劝退的部分。但趋势科技这类外企安全厂商的校招笔试动态规划考察的难度其实比较克制不会出很难的题。爬楼梯、最长递增子序列、最长公共子序列、0-1背包这几类属于高频掌握它们就够应付大多数场合。拿爬楼梯这道题举例一次可以上1级或2级台阶问上n级台阶有多少种方法。它的本质是斐波那契数列状态转移方程是dp[i] dp[i-1] dp[i-2]。public int climbStairs(int n) { if (n 2) return n; int a 1, b 2; for (int i 3; i n; i) { int c a b; a b; b c; } return b; }动态规划的复习重点不在于背状态转移方程而在于三个问题怎么定义状态、怎么推导转移方程、怎么初始化边界。你把这套思考方式练熟遇到新题才有自己推导的能力。说实话这比刷一百道题更重要。3. 基础题网络、操作系统、数据库能不能脱颖而出就看这里3.1 计算机网络从HTTP到TCP/IP必须形成体系安全厂商做的是网络层、应用层的东西所以网络是笔试的重头戏。常见考点包括TCP三次握手和四次挥手、TCP与UDP的区别、HTTP状态码、DNS解析流程、IP地址和子网划分。TCP三次握手为什么是三次而不是两次这是每次必考的问题。核心原因是需要确认双方的收发能力。第一次握手客户端发送SYN服务端知道客户端的发送能力正常第二次握手服务端返回SYNACK客户端确认了自己的发送和服务端的接收都正常同时知道了服务端的发送能力正常第三次握手客户端发送ACK服务端确认了客户端的接收能力正常。如果是两次握手服务端无法确认客户端的接收能力是否正常可能造成资源浪费和连接错误。答题的时候只背握手过程是不够的你要能解释为什么会有三次以及如果丢包了会怎样。类似的问题还有TCP和UDP的区别视频通话为什么要用UDP这类结合实际场景的题答题时尽量把场景和原理结合起来比干巴巴对比优缺点好得多。3.2 操作系统进程线程、内存管理和死锁操作系统这块考得最多的是进程与线程的区别、死锁的四个必要条件、虚拟内存、页面置换算法、进程调度算法。我甚至见过有同学把进程和线程的区别背了但一问进程之间怎么通信就开始支支吾吾。这套卷子里进程通信也是一个绕不开的点。死锁这块四个必要条件要烂熟于心互斥、请求与保持、不可剥夺、循环等待。对应的预防方法也很固定破坏互斥条件不太现实但可以用SPOOLing技术破坏请求与保持条件就要求进程一次性申请所有资源破坏不可剥夺条件就是资源可以被抢占破坏循环等待就是给资源编号要求按序申请。安全产品开发岗为什么要问操作系统因为杀毒软件要做文件监控、进程监控要理解系统调用和内核态用户态的切换。你连进程调度和虚拟内存都说不清很难让人相信你能处理底层安全相关的工作。3.3 数据库SQL和索引原理一个都不能少数据库题通常分两类一类是写SQL语句另一类是考索引和事务的原理。SQL题里分组统计、多表连接、子查询是高频考点。比如这样一道常用题查询每个部门里员工数量超过5人的部门名称和员工数。SELECT d.name, COUNT(e.id) AS cnt FROM department d LEFT JOIN employee e ON d.id e.dept_id GROUP BY d.id, d.name HAVING COUNT(e.id) 5 ORDER BY cnt DESC;这里要注意GROUP BY的写法select出来的非聚合列最好都出现在GROUP BY里这在某些数据库的严格模式下是硬性要求。HAVING是在分组之后过滤WHERE是在分组之前过滤很多人在这里栽跟头。索引这块最常问的是索引失效的场景和覆盖索引。比如对索引列使用函数、隐式类型转换、like以通配符开头这些都会导致索引失效。复习时不要只背结论可以自己建一张表用EXPLAIN命令看看执行计划观察索引到底有没有生效。这种动手验证的方式比死记硬背可靠得多。4. 语言基础与工程能力C/C和Java怎么复习最有效4.1 C/C的考点指针、内存、构造析构全是细节趋势科技的开发岗对C/C的考察比较看重因为Windows/Linux平台的安全产品底层大多用C/C写。指针和引用的区别、const的用法、内存分配方式、构造函数和析构函数的调用时机、深拷贝与浅拷贝这些都是必考范围。指针和引用这块一个经典的例子void swap(int *a, int *b) { int t *a; *a *b; *b t; } int x 3, y 5; swap(x, y);用指针的话函数里拿到的是变量的地址可以修改原变量用引用也一样能改但引用必须在声明时初始化不能为空也不能改变指向。指针则可以为空也可以重新赋值。面试时如果问什么时候用指针什么时候用引用你要能说出场景可能为空、需要重定向用指针想避免拷贝、又确保非空用引用。内存这块栈区和堆区的区别、malloc和new的区别、内存泄漏怎么排查也是高频。做安全产品的人对内存尤其敏感因为很多漏洞就是内存管理不当导致的。4.2 Java的考点集合、JVM、并发按这个顺序复习如果卷子里有Java题通常集中在集合框架、JVM内存模型、并发编程三块。HashMap的原理是被问爆的题目底层数据结构是数组加链表加红黑树扩容机制、hash冲突怎么解决、为什么线程不安全这些都要能说清楚。并发这块synchronized和volatile的区别是常考问题。volatile保证可见性和有序性但不保证原子性synchronized可以保证原子性、可见性和有序性。你可以用一个经典的例子解释两个线程同时执行count用volatile修饰count结果依然可能小于20000因为count不是原子操作。只有用synchronized或者AtomicInteger才能保证结果正确。JVM这块校招不太会问特别深但内存区域的划分、类加载机制的几个阶段、垃圾回收的基本算法最好能答出来。特别是新生代和老年代谁适合什么样的回收算法这类问题复习时结合JVM调优的实际场景来理解效果会好很多。4.3 工程能力考查代码规范、异常处理和边界条件程序题拿分不止看算法对不对还看工程的严谨程度。同样是反转字符串一个版本没考虑空字符串一个版本提前做了判空处理后者在阅卷人眼里明显更可靠。异常处理也一样。Java里捕获异常不能只写一个catch (Exception e)就完事你要能根据实际情况分类处理。C/C里则要注意资源释放申请了资源就要想着对应释放RAII思想在校招笔试中的体现就是看到new就要想到delete。我改过不少笔试卷子说句实话很多代码逻辑是对的但一上来就写连个空指针判断都没有或者命名全是a、b、c这种无意义的字母。阅卷人一天看几百份卷子看到这种代码即使思路对也想多扣几分。写干净、规范、有防御意识的代码本身就是一种竞争力。5. 常见问题与答题技巧实录时间分配、心态管理和止损策略5.1 时间不够用怎么办我的做题顺序和止损思路笔试最常见的惨案是时间不够。一份卷子放在面前题目难度不一但时间只有一个多小时很多同学在编程题上耗了太久导致后面的基础题来不及做白白丢分。我个人的做题策略是这样发卷后先用3到5分钟扫一遍全部题目按必拿分题、可争分题、放弃题三个档次分类。选做顺序是语言基础题和简单编程题最优先因为这是送分题网络、操作系统、数据库的基础概念题其次因为这是记忆性知识会就是会不会就是不会拖得再久也编不出来复杂编程题和综合分析题放最后能做多少做多少。这里有个止损的原则如果一道题超过十分钟还没有任何思路果断跳过。校招笔试不是高考不要求你拿满分它的目的是在有限时间内筛选出最合适的人。你在一道题上死磕丢的是后面十道题的分这笔账怎么算都不划算。题目类型建议单题用时超时处理策略语言基础题3-5分钟超时就先蒙一个不恋战概念解答题5-8分钟超过8分钟先跳过最后回来补简单编程题10-15分钟画出思路就写别反复重写复杂编程题15-20分钟10分钟没头绪就换题有时间再回来看综合应用题10分钟左右先写流程和关键点不追求满分5.2 遇到完全不会的题怎么答才不白卷很多同学遇到不会的题直接空着这是最亏的做法。阅卷人看的是你的综合能力一道题完全空着连一点思考过程都没有他想给你分都给不了。哪怕你不能完整解出来也要写出相关知识点、写出大概思路、甚至画个草图。打个比方题目问虚拟内存的作用你答不上来但你知道分页和页表那你就写虚拟内存通过分页机制让进程拥有独立、连续的逻辑地址空间顺便画个逻辑地址到物理地址的转换过程。这不丢人反而能让阅卷人看到你懂一部分至少不是什么都不懂。我经常和学弟学妹说笔试的答题过程就像面试的自我介绍你不一定能覆盖所有点但你要让对方看到你的思考路径。哪怕是最后一步卡住了也要把你走到哪一步清清楚楚地写出来。阅卷人眼里一个能写出大部分思路的人比一个空着题的人有价值得多。5.3 读题不仔细是笔试丢分的隐形杀手有一种丢分最冤不是不会做而是把题目看错了。比如题目要求用Java实现你整篇卷子用C;题目要求输出满足条件的格式你输出数组本身;题目说不用考虑边界输入你还是写了边界判断看似严谨实则浪费。我有个习惯拿到题目先给关键词划线语言要求、输入输出格式、时间复杂度要求、需要实现的具体功能。把这些划出来再开始写代码。这个习惯帮我避免过特别多低级错误。还有就是注意题干里那些陷阱词。比如请用非递归方式实现说明递归虽然能做但不符合要求请写出时间复杂度和空间复杂度说明你在代码完成后还要补上复杂度分析。这些细节往往是阅卷人的评分点别忽略。5.4 编程环境不熟悉先做一次模拟考试校招笔试的在线编程环境和本地IDE有很大差别没有自动补全、没有本地调试、代码编译报错不友好甚至有些环境不支持重命名变量。很多人第一次在这种环境下做题各种不适应本来会写的题也写崩了。我建议在正式笔试之前拿一套往年的题去牛客网或者赛码网严格按考试时间做一次全真模拟。目的是熟悉在线答题流程、感受时间压力、测试自己的输入输出处理能力。至少做一次你会发现自己比想象中更容易在边界条件上翻车。6. 笔试之后从试题反推面试重点与复习方向6.1 从卷子里的高频知识点倒推面试会追问什么笔试不是终点而是起点。你做完一套卷子最高效的利用方式是反过来分析这套卷子考了哪些知识点哪些是你答不上来的这些知识点在面试中大概率会被继续追问。比如卷子里考了TCP三次握手面试官就可能追问为什么挥手要四次TIME_WAIT为什么要等2MSL。卷子里考了HashMap的结构面试官就可能追问红黑树和链表的临界值为什么是8为什么线程不安全。你把笔试暴露的问题一个个补上面试时就不会再被同样的点卡住。我在准备面试时会做一件事把笔试做错的题整理成一个表格每个知识点后面写上笔试掌握程度和面试追问风险然后把风险高的优先补。这套方法很笨但非常有效。6.2 安全厂商开发岗的独特加分项怎么补最实在如果你确定要投的是安全厂商的开发岗除了常规的开发知识还有几样东西能让你在笔试和面试中都加分。第一个是Linux基础。安全产品大量部署在Linux服务器上你至少得熟悉常用的文件操作、进程管理、网络排查命令。会看日志、会用ps、netstat、tcpdump这些能力在面试时会让你明显区别于纯业务开发出身的人。第二个是脚本语言能力。Python也好Shell也好安全团队经常需要写自动化脚本分析样本、处理日志。笔试不一定直接考但面试时聊到项目经历你能说一句我写过Python脚本批量处理过xxx很加分。第三个是调试和逆向的基础认知。不用你会做逆向分析但你要理解调试器、反汇编、可执行文件格式这些概念。在安全厂商的面试官面前这些术语能够证明你是真的对安全有兴趣而不是只为了拿一个offer。6.3 给准备校招的人一份复习清单按优先级排序如果你现在离校招还有两三个月我建议按这个顺序分配精力数据结构与算法是第一优先级每天保持刷题手感;计算机网络和操作系统是第二优先级因为这两块是面试的重灾区;C/C或Java语言基础是第三优先级重在把常考的点答透;数据库和Linux是第四优先级广度优先不求深。复习的时候不要光看不练也不要光练不看。看十天书再刷一天题效果远不如每天各花两小时。给自己定个固定的节奏比如上午刷算法题下午过基础概念晚上整理错题和知识点长期坚持效果比突击好太多。我个人在实际操作中的体会是像趋势科技这种外企安全厂商的校招笔试并不追求你是个全能天才它更像是一次系统性的体检看看你大学四年有没有把计算机的基础打扎实。你在试卷上暴露的每一个问题其实都是未来成长的入口。基础扎实的人面对什么年份的卷子都不慌因为题在变底层逻辑永远在那里。最后再分享一个小习惯每次模拟笔试结束花十五分钟把自己卡住的知识点抄在卡片上考前只看卡片效率比翻书高得多。