ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

爱奇艺校招C方向笔试复盘:从C语言基础到编程题的考点解析

爱奇艺校招C方向笔试复盘:从C语言基础到编程题的考点解析 不知道你有没有经历过那种校招季投出去的简历像石子一样丢进水里眼看就要石沉大海突然邮箱弹出一封XX科技2020校园招聘笔试通知整个人立刻从椅子上弹起来。我印象最深的就是爱奇艺C方向的第一场笔试。当时我还在犹豫这个岗位到底更看重算法还是更看重C语言功底结果卷子一发下来发现它考察的维度和普通互联网公司的C开发岗还不太一样。这篇文章就把我自己的答题经历和后续复盘整理出来结合当时一起笔试的同学交流出来的题目回忆给准备投爱奇艺C方向相关岗位的同学做一个参考。需要先说清楚一点爱奇艺的笔试是从题库里抽题组卷的所以每个人实际拿到的题目顺序和部分小题可能不一样但考点覆盖面基本稳定。我下面整理的这些题目和大致的考察方向是根据当时第一场多位同学的回忆拼出来的可能与原题不是逐字一致但考查内核是同一个意思。如果你正在准备校招与其去背所谓的原题不如把我列出的这些知识点吃透因为它们代表的是出题组真正想测试的能力。1. 爱奇艺2020校招C方向笔试整体复盘题型分布与时间分配1.1 笔试的题型构成与考试形式爱奇艺2020校招这一场C方向笔试从同学们反馈来看整体是选择题编程题的组合个别批次还插了不定项选择和填空。考试时间给得比较紧张我当时那场是90分钟选择题大概占60分编程题占40分不同批次可能有浮动。这套组合的好处在于选择题能快速覆盖计算机基础、C语言语法、数据结构、操作系统和网络这些硬知识编程题则重点考察代码能力和算法思维。选择题数量一般在20到30道之间每道题的分值不高但题目密度大几乎没有太多犹豫的时间。编程题一般是2到3道第一道通常是基础题比如字符串处理或者链表操作后面的题难度梯度会拉开最后一道往往涉及到动态规划或者复杂场景模拟。我当时遇到的第一道编程题是字符串相关第二道是链表操作第三道是动态规划这个顺序基本符合由易到难的出题逻辑。实话说这种题型设计对做题节奏要求非常高。很多同学栽在时间分配上不是在选择题上磨太久就是被第一道编程题卡住不愿意跳过。我个人的策略是选择题每题超过90秒还拿不准先标记等编程题做完了再回头想。因为选择题再纠结也就是一两分编程题一道就是十几二十分性价比完全不在一个水平线上。1.2 考察范围背后的人才筛选逻辑为什么爱奇艺C方向笔试要这么设计这得从岗位需求说起。爱奇艺的业务场景有不少是视频编解码、播放器内核、音视频处理、高性能网络服务这类偏底层的开发工作这些岗位对C/C的依赖度很高而且对内存管理、并发处理、底层系统交互这些能力有实打实的要求。笔试出题组显然不是随便拉一套通用题库而是有意在选择题里加重了内存布局、指针、字符串函数等C语言专属考点的比例。另外我发现这套题还有一个特点它不太喜欢考那种八股文式的概念背诵而是喜欢把知识点揉进一小段代码里让你判断输出。比如同样考数组和指针的关系它不会直接问数组名是什么而是给你几行初始化代码问某个表达式的结果。这种考法更贴近实际开发中遇见问题的场景因为你在写代码时不会有人拿个概念题来考你只会让你面对一段行为诡异的代码去定位问题。理解了这层逻辑备考方向就清晰了。与其去死记硬背各种定义不如把重点放在读代码、想输出、找问题这三件事上。爱奇艺这套笔试题本质上是在用选择题考察你的语言基本功和对运行时行为的直觉用编程题考察你能否把思路转化为严谨的代码。下面我按题型拆开来细讲。2. 选择题高频考点解析C语言基础与计算机基础2.1 C语言语法细节指针、内存、字符串函数C方向的选择题里指针和内存相关的内容几乎占据半壁江山。最经典的一类题是数组指针配合偏移运算印象里当时就有这样一道题#include stdio.h int main() { int a[5] {1, 2, 3, 4, 5}; int *ptr (int *)(a 1); printf(%d\n, *(ptr - 1)); return 0; }输出是什么答案是5。很多人第一眼看到a 1觉得指针只是指向了数组第二个元素的地址但实际上a的类型是int(*)[5]也就是整个数组的指针所以a 1会跳过整个数组指向数组末尾后面的位置。ptr - 1才是数组最后一个元素。这类题就是想考你有没有真正理解数组名、取地址后的类型以及指针步长的概念。结构和内存对齐也是爱奇艺笔试的常客我记得有一道题给了下面这个结构体问sizeof是多少typedef struct { char a; int b; char c; } Node;如果对内存对齐没有概念很多人会直接算成 1 4 1 6。但实际在默认对齐规则下char a占1字节后为了保证int b按4字节对齐编译器会在后面填充3个字节int b占4字节char c占1字节后整个结构体还要对齐到4字节的整数倍又填充3字节所以结果通常是12。当然不同编译器和不同对齐选项下结果会有差异但考试默认是常规的4字节对齐。字符串函数这块爱奇艺也特别喜欢考。比如strlen和sizeof的区别strcpy、strcat的边界安全问题memcpy和strcpy的适用场景甚至会让判断一段含strcat的代码是否可能造成缓冲区溢出。这些东西平时写业务代码可能注意不到但一旦涉及播放器或者网络协议解析缓冲区溢出就是非常严重的安全问题所以出题组在这个方向下功夫是有原因的。2.2 操作系统与网络基础知识考点C方向笔试不会只考C语言操作系统和网络也是重头戏。我当时遇到的操作系统题目里进程和线程的区别、死锁产生的四个必要条件、虚拟内存和页面置换算法这几个高频考点都出现了。特别是进程线程那道题它会具体到哪些资源是线程之间共享的哪些是线程私有的如果不清楚每个线程有自己的栈、寄存器上下文和程序计数器而代码段、数据段、打开的文件是共享的就很容易选错。网络部分TCP的三次握手和四次挥手是必考内容爱奇艺的题甚至细化到了第二次握手之后服务端进入什么状态。答案是SYN_RCVD不是ESTABLISHED这个细节很多人会忽略。另外HTTP状态码也很常见比如 301、302 的区别404和410的区别502和504的区别。我记得有一题问503 Service Unavailable表示什么选项里有服务器临时过载也有服务器永久不可用这题就是看基础概念扎不扎实。有意思的是这套卷子里还出现了一些和视频场景相关的题目比如带宽、码率、分辨率的换算关系或者视频流传输中丢包对体验的影响。这其实是爱奇艺的行业特色题如果有心准备在看笔试知识点的时候顺带了解一下流媒体传输的基础概念会占不少便宜。我当时没料想到会考这些靠常识猜了一部分后来复盘觉得如果提前准备这一块是能拿稳分的。3. 编程题核心拆解从冒泡排序到字符串处理3.1 字符串类题目逆序输出的多种实现第一道编程题通常是送分题但即使是送分题也要答得漂亮。当时我们遇到的第一道题很有代表性字符串逆序输出。要求不能用库函数手动实现一个函数将输入字符串逆序输出。最容易想到的做法是双指针从两端往中间交换字符时间复杂度O(n)空间复杂度O(1)void reverseString(char *s) { if (s NULL) return; int left 0; int right strlen(s) - 1; while (left right) { char tmp s[left]; s[left] s[right]; s[right] tmp; left; right--; } }这个解法本身不难但有几个细节是阅卷时比较在意的。第一入参检查如果s是空指针直接返回否则调用strlen会崩。第二整个函数要原地修改不需要额外开数组这体现空间意识。第三left和right要用int还是size_t如果用无符号整型要小心right减到0后继续减变成SIZE_MAX循环条件可能出问题。我还见过有同学用递归实现字符串逆序思路是交换首尾字符后递归处理子串。虽然递归写法更短但在笔试中不推荐因为字符串长度稍长就可能栈溢出而且空间复杂度不是O(1)。我当时写完双指针版本之后又在备注里补了测试用例空串、单字符、奇数长度、偶数长度、含空格。这些细节看上去不起眼但能很直接地体现出一个人的工程习惯爱奇艺这种重视代码质量的团队肯定喜欢。3.2 经典算法题排序、链表与动态规划第二道编程题我们当时遇到的是链表相关的操作好像是反转单链表。反转链表算是最基础也最经典的链表题了但在笔试环境下写对还是有难度的。核心是用三个指针迭代struct ListNode* reverseList(struct ListNode* head) { struct ListNode *prev NULL; struct ListNode *curr head; while (curr ! NULL) { struct ListNode *next curr-next; curr-next prev; prev curr; curr next; } return prev; }这个函数的重点是next curr-next必须在修改curr-next之前保存否则后面就没法继续遍历了。很多人在白纸环境下写这道题容易忘记保留下一个节点结果链表断掉。另外要注意返回值是新的头节点prev不是curr因为循环结束时curr已经变成NULL了。第三道题就是我们比较畏惧的动态规划我记得是一道求最长无重复字符子串长度的题类似 LeetCode 第3题。这道题需要维护一个滑动窗口和一个标记字符是否出现过的哈希表用两个指针 left 和 right 控制窗口边界int lengthOfLongestSubstring(char *s) { int lastIndex[128]; for (int i 0; i 128; i) lastIndex[i] -1; int left 0, maxLen 0; for (int right 0; s[right] ! \0; right) { if (lastIndex[s[right]] left) { left lastIndex[s[right]] 1; } lastIndex[s[right]] right; int len right - left 1; if (len maxLen) maxLen len; } return maxLen; }这里的关键点在于lastIndex记录的是某个字符最近一次出现的位置当字符重复出现并且在当前窗口内就把窗口左边界跳到上次出现位置的右边。这个解法的时间复杂度O(n)空间复杂度O(1)算是最优解了。动态规划题目在爱奇艺笔试中经常作为压轴题它不只是考察你会不会背模板而是考察你有没有真正理解状态转移和边界条件。4. 笔试过程中的时间策略与答题技巧4.1 选择题的速答方法爱奇艺这套笔试题量大时间紧选择题如果一题一题慢慢啃肯定做不完。我总结出了几个速答技巧实用性很强。第一先看选项再看题干。很多题目是代码输出题选项其实就是输出的可能值你完全可以先扫一眼选项大致判断这道题在考哪个知识点再回代码里找对应信息。这样可以避免被题目中的干扰信息带偏。第二善用排除法。特别是遇到那种问以下说法错误的是的题目把明显正确的选项先划掉剩下的二选一或三选一中成功率会高很多。我当时在TCP状态那道题上就是用排除法先排掉了两个绝对没见过的状态名剩下SYN_RCVD和ESTABLISHED再结合握手时序很快就确定是SYN_RCVD。第三不要恋战。如果一道选择题超过两分钟还没思路就先用直觉选一个在草稿纸上记下题号等编程题做完再回来看。在真实笔试中完整做完所有题这个目标的优先级高于每一题都对因为部分得分好过困在一道题上空转。4.2 编程题的环境准备与答题顺序编程题的环境每家平台不太一样爱奇艺当时用的是牛客网的系统支持C和C也有个别批次的同学说支持其他语言。我建议在笔试前一定要提前登录平台把代码编辑器、编译选项、输入输出测试跑一遍避免考试时才发现快捷键不熟悉或者输出格式有问题。我当时专门花了半小时在牛客网上练了一下本地读入、循环处理多组测试用例这种基本功这些看起来简单但到了高压状态下很容易出错。答题顺序上我一直坚持先易后难、先拿分后优化。第一道编程题通常是基础题一定要稳拿第二道如果卡住不要死磕先跳过看第三道因为第三道即使是动态规划也可能有暴力解法的部分分。我当年就是先写了第三道暴力解拿到部分测试用例的分数后再回头慢慢想第二道的最优解。最后果然第二道链表题用迭代法写出来了但如果不先拿第三道的部分分最后可能两头空。还有一个很多人会忽略的地方提交代码前一定要自己心里跑一遍样例。当时有位同学链表反转一直没写对就是因为循环里next保存的位置不对他写完就提交两次编译失败后时间就没了。如果提交前在草稿纸上画一个简单的链表手动模拟两三轮迭代这类错误完全可以避免。笔试不比日常开发没有断点调试的机会所以手推代码是必须养成的习惯。5. 复盘与备考建议这道笔试给我的几点教训5.1 容易被忽略的C语言细节考完爱奇艺这次笔试之后我最大的感触是C语言的细节平时太容易被忽略了。比如const char *p、char *const p和const char *const p的区别相信每个C语言教材都会讲但真正到了选择题里有没有读清楚变量名和const的位置直接决定答案。我记得当时有一道选择题就是考这个题目给了一堆声明问哪一个表示指针本身不可修改。很多人背了结论却不会灵活应用看到char * const p时还在犹豫。另一个很容易错的知识点是sizeof作用于数组名和指针的区别。在函数参数中数组退化成指针所以sizeof(arr) / sizeof(arr[0])只有在你真正持有数组定义的地方才能正确得到数组长度。爱奇艺的题库里就有这种题给你一个void func(int a[])的函数定义里面sizeof(a)的结果是多少答案是4或8取决于平台反正不是10。如果你在工作中用过这种写法大概率踩过这个坑所以它才会被当成笔试考点。字符串函数这块strncpy的一个大坑是它不一定以\0结束如果源字符串长度大于等于指定长度strncpy不会自动补终止符。这道题我在笔试里遇到过变体当时考的是strncpy之后调用strlen的结果不能想当然。建议所有准备C方向校招的同学把strncpy、strncat、snprintf这类安全版本函数的边界行为彻底搞清楚因为这些在笔试里是高频送命题。5.2 校招笔试与面试的衔接准备笔试不只是笔试它往往还决定了面试时会被问到什么。我后来到面试环节发现面试官手里有我的笔试成绩和答题记录他会直接拿笔试里我写错的题问我当时怎么想的。所以考后复盘绝对不是可做可不做而是要非常认真。每一道选择题的错题都要整理成笔记不仅记录正确答案还要记录错误选项为什么错以及如果面试官深挖我应该怎么解释。对于编程题面试官可能不会让你重写一遍而是会追问你这个解法如果数组特别大会不会溢出能不能优化到O(n)。所以笔试结束之后把每道编程题的最优解、次优解和时间空间复杂度都过一遍是很有必要的。我当时就是因为最长无重复子串只写了滑动窗口解法面试官追问有没有其他做法时我只能现想答得比较仓促。如果提前准备完全可以从暴力枚举说到哈希优化再到滑动窗口形成一个完整的思路梯度。另外准备笔试时要结合公司业务。我前面提到爱奇艺有一些视频相关的基础题所以在投递这个岗位之前建议先了解下音视频处理的基本概念比如编码、封装、码率、帧率这些词到底什么意思。不用学太深但至少看到题不会懵。这其实也和面试中的为什么选择爱奇艺这种问题呼应你表现出对视频技术的兴趣会比单纯刷题更有说服力。还有一点很实际在笔试前把编程环境准备好。这里说的环境不只是考试平台也包括你自己平时刷题用的IDE。我当时用的是VS Code配C/C插件一方面语法提示方便另一方面调试功能足够。如果你还在整C语言开发环境比如遇到VS Code中代码没有提示、编译路径配错之类的问题建议提前解决不要等到笔试前才折腾环境。记住一点环境问题看似小事但它会在最不该出现的时候消耗你的精力和信心。6. 写在最后关于这场笔试的几点个人体会如果让我用一句话总结爱奇艺2020校招C方向第一场笔试的特点我会说它考的不是你会不会背知识点而是你在真实代码面前能不能反应出问题。这场笔试结束后我最大的收获不是那点正确答案而是发现了自己平时写代码太依赖IDE和搜索引擎很多基础细节其实没有真正掌握。我给正在准备类似校招笔试的同学一个建议刷题时一定要做错题本。这个错题本不是简单抄题而是把每道题背后的知识点、我的错误理解、正确的推导过程全部写清楚。尤其是选择题里那些关于指针、内存、结构体对齐的题过两周再看回错题本效果比自己闷头刷一百道新题还要好。还有一个在笔试中验证过的小技巧交卷前如果还有时间试着把编程题的代码最后再审一遍重点关注空指针、数组越界和返回逻辑这三个地方。我见过太多代码逻辑正确却在边界条件上翻车的例子。笔试这件事运气和实力都在起作用但把能守住的分都守住运气的作用自然就小了。希望这篇复盘能给你带来一点帮助也祝你准备校招笔试时少踩一点我踩过的坑。
返回列表