尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

爱奇艺2020校招笔试真题解析:考点分布与破题思路

爱奇艺2020校招笔试真题解析:考点分布与破题思路 1. 爱奇艺2020校招笔试考题全貌与破题思路每年秋招季各大厂的笔试题目都会被刷屏一波爱奇艺的这套2020校招编程题在当年也是引发了不少讨论。很多人拿到题目第一反应是“这题我好像在哪见过”但真动起手来思路卡住、边界条件写错、超时的情况比比皆是。我把这类题目重新复盘整理了一遍结合当时考生们踩过的坑聊聊爱奇艺校招笔试到底在考什么、怎么准备最划算。先说结论爱奇艺的笔试整体风格偏“稳”不会故意出偏题怪题但非常看重基本功和边界处理能力。题目难度呈阶梯式分布大致可以分成三档第一档是签到题基本会写循环和数组就能过第二档是中等题涉及常见算法模板比如栈、滑动窗口、简单动态规划第三档是区分度题通常需要一点点思维转变或者对某个算法有比较深入的理解。把三档题的分布和考点理清楚准备效率会高很多。这套题适合谁主要给两类人一类是正在准备校招、尤其是瞄准视频和内容平台方向的同学通过真题了解大厂笔试的出题口味另一类是已经工作但想保持刷题手感的人拿几道有代表性的题做复盘看看自己的思维有没有固化。无论哪种情况建议不要只对着题解背代码要把“为什么会这么想”这一层想明白。我见过不少人的刷题方式是一道一道做做完就忘下次遇到同类题还是不会。这是性价比最低的复习方式。爱奇艺这类大厂的题目虽然每年都换但考查的知识点是高度集中的把有限的高频考点吃透远比盲目刷一百道题有效。下面我会把考点分布、典型例题、完整代码和实战经验都展开讲文章里出现的代码都是可以直接复制到本地跑通的建议边看边在编辑器里敲一遍。2. 考点分布与题型构成先看清“地图”再动手2.1 考试形式与题目结构爱奇艺2020校招的笔试形式在当年属于比较标准的在线笔试限时大概90到120分钟全程在牛客网或者赛码网上完成。整套卷子一般由三部分构成单选题、多选题、编程题。单选和多选主要考察计算机网络、操作系统、数据库、数据结构基础等计算机通识内容这部分如果科班出身靠平时的积累基本能应付。真正拉分的还是最后的编程题。编程题一般是3到4道每道题的分值占比不同。按照往年规律第一道题通常是简单题比如模拟、字符串处理用来筛选基本代码能力中间一道是中等难度常见的是贪心或者简单DP最后一道往往拔高可能是复杂状态DP也可能是不太容易想到的思维题。整套题目做下来能全部AC的人不多但把自己会的题稳稳拿满再“骗”到部分分就能超过很大一批人。这里要特别提一下在线评测系统。爱奇艺那时用的系统以牛客居多输入输出格式比较固定需要用标准输入输出不支持交互式页面里手动填测试数据至少绝大多数题目是这样。日常刷LeetCode习惯了函数式传参的同学一定要提前适应一下如何处理多行输入、如何自己处理EOF。这看似是个小问题但真的有人因为不熟悉读入方式在简单题上浪费了20分钟。2.2 高频考点统计与出题偏好把2020年前后爱奇艺的笔试题目汇总来看考点集中在五个方向我列了一张表同时标注了大致占比和自己的分析考点方向出现频率典型题目类型出题意图字符串处理高括号匹配、字符串去重、子串查找考察代码基本功和边界条件处理动态规划高最大子序列、翻译字符串计数、背包变体考察状态抽象和转移方程推导贪心算法中区间调度、任务安排、排序思维题考察对问题本质的判断力数据结构应用中栈、队列、堆、哈希表的灵活使用考察经典数据结构的场景识别能力数学/规律题低排列组合、取模运算、找规律考察数学建模与快速推理现在逐个分析一下。字符串处理几乎是大厂笔试里必出现的方向爱奇艺也不例外。本质原因很简单视频平台海量的元数据、弹幕、评论、搜索词都是字符串数据相关业务场景多考察字符串处理也是检验候选人对线上系统数据形态的敏感度。动态规划更是重中之重。爱奇艺的DP题不会特别难基本不会出到插头DP或者树形DP这种竞赛级别但经典模型非常常见比如“最长递增子序列”、“不同路径”、“编辑距离”的简化版等。这意味着准备DP时不要贪多求难把基础模型彻底吃透、做到能默写性价比最高。贪心和数据结构的题则偏向“中等难度”的分档。很多人会觉得贪心很难证明其实在笔试中你只需要能举出反例排除明显错误的想法然后用直觉选一个看起来最合理的策略再快速写出来验证。数据结构题则是“模板扫描”题看到题目要求最值、窗口、频次就要下意识想堆、单调栈、滑动窗口。3. 核心细节解析与做题方法论技术背后的原理3.1 字符串处理类别小看“简单题”爱奇艺笔试里的字符串题看起来往往人畜无害比如“去除字符串中重复的字符并保持顺序”或者“判断括号字符串是否有效”。但这类题恰恰是失分重灾区原因不是不会做而是边界条件处理不完整。拿“括号匹配”举例很多人一上来就想到栈这是对的但有一个隐藏问题常被忽略遍历结束后栈不为空怎么办这就是典型的边界处理。再比如“去除重复字符并保持字典序最小”这个题如果只用一个布尔数组记录是否出现过看似没问题但还需要保证最终结果的字典序最小那就得在入栈时考虑是否能弹出更大且之后还会出现的字符。这个思维层级就比单纯去重高了一档。我建议准备这类题时刻意培养三个习惯先把输入数据里最极端的情况想清楚比如空字符串、全部是重复字符、字符串长度达到上限等。不要急着写代码先手动画几个例子把逻辑走通。写完之后用至少两个边界用例去测试自己的代码而不是只看样例输出过了就提交。这三个习惯看着简单但在笔试紧张状态下特别容易省略而省略的直接后果就是“只过了部分测试点”。3.2 动态规划从“不会做”到“套路化”动态规划是大厂笔试里区分度最高的一类题。很多人畏难觉得DP需要“灵光一现”其实不然。应试场景下的DP绝大部分是套路化的只要按步骤走就能把一道看似无从下手的题解出来。我总结的DP四步法是定义状态。想清楚dp[i]代表什么。这一步最反直觉因为你得先猜测然后再验证。通常做法是拿题目的输入规模来猜比如输入一个长度为n的数组常见状态就是dp[i]表示“以第i个位置结尾的某种值”。找转移方程。想清楚dp[i]怎么由之前的dp值推出来。这一步需要你把问题缩小如果我知道前i-1个位置的所有结果怎么算出第i个定初始条件。一般dp[0]或dp[1]是明确的或者用一个虚拟节点来简化。确定遍历顺序和返回值。有些题是正着遍历有些得倒着还有些是二维双层循环顺序错了结果就完全不对。这四步看起来简单但真正做题时大部分人卡在了第一步状态定义不清晰。我见过很多同学面对一道题第一反应是“这题怎么套模板”而不是“这个问题的规模能帮我定义什么状态”。所以我建议平时练习时给自己限定时间哪怕想不出来也要写出至少一个状态定义的尝试。写错没关系关键是要有这个动作练多了自然就有感觉。3.3 贪心与数据结构识别“信号词”很重要贪心算法的难点不在实现而在“敢不敢用”。考试时你很难在短时间内严谨证明一个贪心策略的正确性但你可以在草稿纸上举几个极端例子如果反例举不出来大概率是对的。这是笔试实战里最高效的策略。举例来说遇到“求最大/最小xxx且每次操作具有某种局部最优性质”的题目第一反应可以先往贪心想。比如区间调度问题按结束时间排序尽量选早结束的这就是经典贪心。如果你面试时能说出“这题是典型的区间调度贪心模型”面试官通常就会点头因为这说明你有过系统性的总结。数据结构题则更直接题目中一旦出现“窗口”、“前K个”、“第K大”、“频率最高”这类关键词立刻就要在脑子里把对应的数据结构拉出来滑动窗口配双指针、前K大配堆、频率配哈希表。这不是死记硬背而是写多了之后的肌肉记忆。我建议把每种数据结构的典型应用场景做成笔记刷题前翻一翻比零散地做几道题更管用。4. 实操过程与核心环节实现三道典型题的完整解法4.1 题目一最小删除次数使括号字符串有效这是一道有代表性的字符串栈的题目也是爱奇艺笔试中比较典型的难度。题面如下给定一个只包含(和)的字符串每次可以删除任意一个位置的字符求最少删除多少次能使得剩下的字符串是合法的括号序列。这个题的信号词非常明显合法括号、删除、最少。先分析怎么判断一个括号串合法从左往右扫描维护一个计数器遇到左括号加一遇到右括号减一扫描过程中计数器不能为负最终计数器等于0。这个规则是后续所有解法的基础。现在要求最少删除次数很多人第一反应是用动态规划但其实贪心就够。我们维护两个变量left_count表示当前未匹配的左括号数量delete_count表示已经删除的字符数量。遍历每个字符如果当前字符是(直接把left_count加一这意味着我们先假定这个左括号会保留。如果当前字符是)分两种情况。如果left_count 0说明有左括号可以和它匹配把left_count减一否则说明这个右括号没有匹配的左括号必须删除delete_count加一。遍历结束后left_count里剩下的都是无法匹配的左括号也需要全部删除所以最终答案就是delete_count left_count。这个算法的核心思想是一个右括号如果出现在它左边没有任何可用左括号的位置那它必然是多余的等到最后多余的左括号也一目了然。用栈也能实现但如果只是计数不需要真的维护栈内容代码更简洁。def min_deletions_to_valid(s: str) - int: left_count 0 delete_count 0 for ch in s: if ch (: left_count 1 else: # ch ) if left_count 0: left_count - 1 else: delete_count 1 return delete_count left_count # 测试 print(min_deletions_to_valid(()))) # 1 print(min_deletions_to_valid(((()) # 3 print(min_deletions_to_valid(()())) # 0 print(min_deletions_to_valid((()()()) # 1这个解法的时间复杂度是 O(n)空间复杂度是 O(1)。实际考试中这道题的通过率还算高但许多人在“(((“这种极端样例上翻了车忘记最后处理剩余的左括号。所以写完代码后务必在脑中过一遍全左括号和全右括号这两种极端输入。4.2 题目二把数字翻译成字符串的种数这道题在爱奇艺系笔试里出现过变体核心是动态规划。经典题面是这样的给定一个数字字符串只包含0-9按照映射规则1 - a、2 - b、...、25 - y、26 - z问这个数字串一共有多少种不同的翻译方法。注意06不能翻译成f因为前导0不算合法映射。这题的入手方式不是硬想而是先看规模。给定一个长度为n的字符串问总共有“多少种”这个“方案数”信号基本就是DP没跑。而且它的状态其实很自然用dp[i]表示“前 i 个字符有多少种翻译方法”。接下来推转移。前 i 个字符的翻译方案最后一步要么翻译最后一个字符单独一个数字要么翻译最后两个字符两个数字组成的数字。如果最后一个字符单独翻译那么前 i-1 个字符的方案数就直接加到 dp[i]如果最后两个字符能组成一个合法数字10到26之间且没有前导0那么前 i-2 个字符的方案数也要加到 dp[i]。判断“最后两个字符合法”时有几个坑如果第二个字符也就是最后一个字符是0那么它不能单独翻译只能和前面的数字组合成10或20。如果第一个字符是0比如“05”是不能组队的因为组合出来的“05”不是合法映射。如果组合出来的数字大于26也不行。所以转移方程可以写作 dp[i] dp[i-1]当 s[i-1] ! 0 dp[i] dp[i-2]当 i 2 且 int(s[i-2:i]) 在 10 到 26 之间初始条件dp[0] 1表示空串有1种翻译方式什么也不翻译。dp[1] 则看第一个字符是不是 0不是则 dp[1]1是则 dp[1]0。def translate_num(s: str) - int: n len(s) if n 0: return 0 dp [0] * (n 1) dp[0] 1 for i in range(1, n 1): # 单独翻译 s[i-1] if s[i - 1] ! 0: dp[i] dp[i - 1] # 组合翻译 s[i-2] 和 s[i-1] if i 2: two_digit int(s[i - 2:i]) if 10 two_digit 26: dp[i] dp[i - 2] return dp[n] # 测试 print(translate_num(12)) # 2可以翻译成 ab 或 l print(translate_num(226)) # 3可以翻译成 bz、vf、bbf 等 print(translate_num(06)) # 0 print(translate_num(10)) # 1这里有一个非常关键的经验DP题里空间优化通常是最后一步而不是第一步。很多同学一上来就想着“能不能只用两个变量滚动更新”结果状态含义还没理清楚就开始写最终越写越乱。我建议在笔试时优先写出完整的一维dp数组保证正确性如果时间充裕再考虑滚动数组优化。考试评分看的是最终正确性不是代码是否优雅。4.3 题目三最长无重复字符子串这道题属于看起来简单但写起来很容易出bug的类型也是爱奇艺笔试中字符串处理方向的代表题。题面很简单给定一个字符串找出其中不含有重复字符的最长子串的长度。主流解法是滑动窗口也叫双指针。用两个指针left和right维护当前窗口的左右边界窗口内没有重复字符。每次把right向右移动一格把新字符纳入窗口。如果发现新字符和窗口内某个字符重复就把left不断右移直到窗口内没有重复字符为止。整个过程用一个集合seen记录窗口内已有的字符。关键点是左指针怎么移动。假设当前窗口是s[left:right]新字符是s[right]。如果s[right]在seen里说明有重复我们需要把s[left]从集合里删掉然后left 1重复这个过程直到s[right]不再集合里。这样每次右指针只移动一次左指针也最多移动n次总复杂度O(n)。def length_of_longest_substring(s: str) - int: seen set() left 0 max_len 0 for right in range(len(s)): while s[right] in seen: seen.remove(s[left]) left 1 seen.add(s[right]) max_len max(max_len, right - left 1) return max_len # 测试 print(length_of_longest_substring(abcabcbb)) # 3 print(length_of_longest_substring(bbbbb)) # 1 print(length_of_longest_substring(pwwkew)) # 3 print(length_of_longest_substring()) # 0很多人第一次写这道题时会犯一个错误重复字符时用left right直接跳但这不对。因为窗口内重复的字符不一定在窗口最左边直接跳会把一些可能构成更长子串的字符排除掉。举个例子s abba当right走到第二个b时窗口是ab此时b已经在窗口里但你如果直接left rightleft会跳到当前位置接着right继续走最终结果会是2但正确答案是2没错这题巧合通过。再比如dvdf如果重复时直接左指针跳到right会得到2但正确答案是3vdf。所以必须老老实实用while循环逐步收缩左边界。这类题目在笔试中非常典型考察的不只是“知不知道滑动窗口”更是你能不能把窗口收缩的细节写对。5. 笔试常见问题与排查技巧实录5.1 输入输出与评测环境避坑在线笔试和本地IDE有个很大的区别你无法用print临时输出调试信息因为所有print都会被当作最终输出。不少人在本地调试时写了print提交前忘记注释结果程序在评测机上报“输出格式错误”整题0分。这个坑几乎每场考试都有人踩。处理办法非常简单提交前把代码里所有临时的print、log输出全部注释掉最好养成条件反射。另外一个常见问题是Python的输入读取考试系统往往用多组测试用例每组的读取方式可能不一样。有的题目用sys.stdin.readline逐行读有的则直接一次性读入再split。建议考前准备好一套自己的输入模板比如import sys def solve(data): # 业务逻辑 pass if __name__ __main__: data sys.stdin.read().strip().split() # 根据题目要求解析 data result solve(data) print(result)用sys.stdin.read()一次性读取能处理大多数场景比逐行读更省心。但要注意如果输入很大一次性读入会占用内存但笔试的输入规模一般不会到那种程度无需过度担忧。5.2 超时问题的排查思路很多人在简单题上栽跟头不是因为逻辑错而是因为复杂度太高导致超时。比如字符串处理里常见的操作是“在循环里反复拼接字符串”这在Python里其实是O(n^2)的因为字符串是不可变对象每次拼接都会生成新串。对付这种场景建议用列表收集片段最后用.join(list)统一合并。再比如写双层循环时先看一眼n的取值范围。如果n是10^5O(n^2)必然超时必须想想有没有O(n)或者O(nlogn)的方案。刷题的时候多留意测试数据的规模慢慢就会形成对复杂度的敏感度。笔试时间有限没有机会做基准测试必须靠预估。5.3 部分测试点过不了的排查顺序常常有人问“我样例都过了为什么提交后只有30%正确率”这里我分享一个排查优先级优先检查边界条件。比如空输入、单个字符、全相同字符、最大值比如10^9。这是最常出问题的位置。再检查有没有重复计数或漏计数。这通常和循环边界有关比如差一错误off-by-one。再看看数据类型有没有溢出。用Python会好一些但如果你用了C/Java就要注意int范围。最后检查是不是多组测试用例之间状态没有重置。例如全局变量、类成员变量在多个用例之间污染了。排查顺序按这个来通常能解决九成以上的“过了样例但不过全题”问题。剩下的一成往往是题目里隐藏了特殊规则这时就要回头仔细读题尤其注意题目描述里的“保证”、“最多”、“至少”这类词。5.4 时间分配与做题节奏根据我在多场笔试中的经验建议的时间分配是拿到卷子先用5分钟快速浏览所有编程题从简单到难排一个做题顺序。千万不要在一道题上死磕超过30分钟。如果一道题卡住了先跳过把后面能拿的分拿到再回头来啃硬骨头。为什么这么重要因为笔试的分数是按通过用例数计算的而不是按题目数。一道50%通过率的简单题可能比一道20%通过率的难题得分更高。先把容易拿的分吃进肚子是应试的基本素养。还有一个实操技巧如果实在没有思路可以写一个暴力解法哪怕只能过20%的用例也比交白卷强。很多评测系统在部分用例上能把暴力解跑过这部分分数不拿白不拿。我曾经见过有人在一道DP题上想了40分钟无果最后写了个暴力递归提交后过了30%的用例顺利进入了面试。这不是奇迹而是策略。6. 备考建议与深度复盘如何把一套题的价值榨干6.1 从“记住答案”到“归纳题型”刷题最大的误区是背题。你会发现今年考的是“用最少删除让括号合法”明年可能是“用最少插入让括号合法”题目稍微一变形背答案的人就原形毕露了。正确的做法是把题目抽象成题型需要理解的是题型背后的心智模型。比如“括号”相关的问题心智模型就是“用计数或栈来维护匹配状态”。学会了这个模型不管题目变成删除、插入、还是判断是否有效你都能快速迁移。再比如“方案数”问题心智模型就是动态规划中的“状态转移”遇到这类题就把DP四步法往上一套大部分都能搭出框架。建议每周做一个题型归纳把本周做过的所有题目按“数据结构/算法标签”分类总结每类题目的共同套路和常见边界条件。坚持一个月效果会非常明显。6.2 手写代码与伪代码草稿笔试现场没有补全功能没有语法高亮甚至连括号配平都要靠自己。这和平时在IDE里写代码的体验差别很大必须提前训练。我自己的做法是平时练习时用简单的文本编辑器比如系统自带的记事本或者在线OJ的代码框直接在里面写代码不依赖自动补全。一开始会很不习惯速度和正确率都会下降但这正是笔试时可能出现的情况。练熟了现场才不会慌。另外遇到复杂题目不要直接上手敲代码。先在草稿纸上写几行伪代码理清主流程。这个习惯能帮你避免写到一半发现思路有问题、推倒重写的尴尬。笔试时间宝贵避免一切形式的返工是最重要的。6.3 复盘比刷题更重要每次笔试或模拟练习结束后花至少30分钟复盘。复盘不是把错题抄一遍而是回答三个问题这题的考点是什么我为什么没做出来是知识点不熟还是思路没打开这题有没有更优的解法如果有优在哪里如果把题目改一改比如把求最大值改成求方案数我应该怎么做带着这三个问题复盘才能把一道题的价值榨干。一套卷子如果只做一遍就扔其实是很浪费的。爱奇艺2020这套题虽然已经过去几年了但考察的知识点和题型在今天的大厂笔试中依然频繁出现。吃透一套经典真题胜过低效地刷十套新题。从我个人的体会来说笔试考的不只是算法能力更是在有限时间内调度知识储备、稳定输出代码的综合素质。那些最终拿到Offer的人未必是每道题都会做但往往是擅长取舍、懂得在简单题上不丢分、在难题上尽量拿部分分的人。这套思路比多会一个冷门算法要重要得多。
返回列表