ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

爱奇艺2020校招C方向笔试题拆解:核心考点与避坑指南

爱奇艺2020校招C方向笔试题拆解:核心考点与避坑指南 爱奇艺2020校招C方向笔试题我拿到手的第一感觉是这是一份非常“标准”的互联网公司校招C/C笔试卷。不偏不怪但坑不少。你说它难吧考的好像都是课本上见过的东西你说它简单吧真正动手写起来能拿满分的人寥寥无几。这份卷子对C语言基本功、数据结构与算法的熟练度、以及工程细节的把控要求很明确适合准备投递爱奇艺C/C后台开发、视频编解码、CDN等方向的同学拿来练手摸底也适合所有正在准备校招笔试的人用来检验自己的短板在哪里。我花了一晚上把整份卷子从头到尾拆了一遍包括考点分布、每类题目的解题思路、容易踩的坑以及几个经典题目手写代码时要注意的细节。这篇内容不是单纯给答案而是想帮你建立一套应对这种笔试题的框架下次碰到同类题目能快速反应。1. 笔试整体设计与考察方向拆解1.1 为什么爱奇艺会这样设计C方向笔试爱奇艺的核心业务是视频流媒体这意味着他们的C/C工程师主要集中在几个方向视频编解码与音视频处理、CDN调度与传输优化、后端服务高并发框架、以及部分客户端组件。这些方向有一个共同特点——对底层资源的管理能力要求极高。视频流媒体领域对性能的要求非常苛刻。打个比方一个普通用户的视频播放请求后端要经过调度节点、转码服务、存储节点、CDN边缘节点等多个环节任何一个环节的内存泄漏或者CPU浪费在高并发流量下都会被无限放大。所以校招笔试对C语言基础考察得特别扎实因为C语言本身就是一门“贴近硬件”的语言指针操作、内存管理、位运算这些能力直接决定了一个人能不能写好高性能的服务端代码。另一个原因是筛选效率。校招笔试面对的是大量候选人需要一个可量化、可快速判断的筛选机制。C/C方向的基础题比如指针运算、结构体对齐、字符串函数实现答案对错非常明确不像一些开放式设计题那样难以评判。这就是为什么这份卷子会大量采用“给出代码找错误”“补全函数实现”这类题型因为它在批量筛人时效率高、争议少。1.2 试卷结构与分值分布参考从整体结构来看这份卷子基本分三大块选择题与填空题、手写代码题、简答与场景分析题。参考爱奇艺历年校招的普遍风格和互联网公司C方向笔试的通行设计我把分值分布做了一个大致推算供你参考题型常见题目数量参考分值占比考察重点选择题10-15题30%-40%C语言语法细节、运算符优先级、指针、内存布局填空题5-8题10%-15%宏定义、位运算、程序输出结果手写代码题3-4题30%-40%字符串处理、链表操作、排序算法简答与场景题2-3题10%-20%内存管理、进程线程模型、网络基础这个结构其实代表了很多互联网大厂C/C方向笔试的通用模板。选择题和填空题主要是快速过滤基础不扎实的人手写代码题用来考察真正的编程能力简答题兜底考察候选人的知识广度和工程意识。如果你在校招准备期完全可以用这个结构去对标训练自己的薄弱环节。2. 核心考点与高频题目类型解析2.1 指针与内存管理绕不开的C语言灵魂指针这块几乎是每一道C语言笔试题都绕不开的核心。我拆完这份卷子最大的感受是出题人把所有常见的指针坑都安排上了。比如指针加法的运算规则、指针数组和数组指针的区别、二级指针传参的问题、空指针和野指针的隐患这些考点全部覆盖到位了。举个例子选择题里大概率会出现类似下面这道题int a[5] {1, 2, 3, 4, 5}; int *p a; printf(%d\n, *(p 2));这个题目考察的是后置自增和指针运算的优先级问题。p先返回p原来的值然后再自增所以*(p 2)实际上是*(p_old 2)先加2再解引用也就是a[2]的值为3。但执行完之后p已经指向a[1]了。这种题目如果你只是背结论不真正理解指针运算的底层逻辑很容易被绕进去。内存管理部分几乎必考malloc和free的配对使用、内存泄漏的排查思路、以及栈区和堆区的区别。爱奇艺这种视频公司对内存问题尤其敏感因为视频转码服务经常需要处理大块的内存数据一旦泄漏跑上两三天的服务内存就爆了。所以笔试题里通过场景题来考察内存管理能力本质上就是在模拟真实的生产环境问题。2.2 字符串处理与经典算法实现字符串处理是另一大块高频考点。字符串逆序、字符串拷贝、字符串查找这几个题目在这份卷子里基本是标配。爱奇艺喜欢考字符串相关的题目其实很好理解——视频网站有大量内容推荐、弹幕、搜索等业务场景字符串处理是最基础也是最常用的能力。字符串逆序这道经典题别看它简单能一次性写对的人比例并不高。很多人第一反应是直接申请一个新的字符数组从后往前拷贝但这忽略了C风格字符串的结束符\0处理。还有些人会忘了考虑空字符串和单字符字符串的边界情况。如果能在笔试中把这类题目写得既简洁又健壮面试官对你的代码习惯会留下很好的印象。算法题目部分除了字符串逆序还可能会考到冒泡排序、简单插入排序、链表的反转和合并这类基础数据结构操作。比较值得注意的还有二分查找的变体需要对边界条件有很清楚的理解才能写对。我见过太多人在left right还是left right、mid要不要加1这个问题上栽跟头这类细节在笔试中非常容易暴露你算法基础是否扎实。2.3 底层原理与工程基础考察简答题和场景题部分考察的是候选人对计算机系统底层原理的理解深度。从这份卷子的出题方向来看进程与线程的区别、虚拟内存与物理内存的关系、堆与栈的区别这些经典问题必然会涉及。爱奇艺的音视频处理服务需要大量的并发线程来处理转码、推流等任务所以对线程同步、锁的使用、死锁产生条件的考察也在所难免。工程基础部分C/C方向还会涉及编译链接的原理比如编译过程的四个阶段、静态链接和动态链接的区别、#include头文件的作用机制。有几个热搜词指向了环境配置问题比如“npm无法加载文件”、“vscode配置C/C环境”这类问题确实挺常见的很多同学在本地跑通了代码但考试时面对的是一个隔离的在线编译环境连本地的环境配置经验都用不上。笔试环境下的编译器和操作系统版本可能你从来没有用过的这种情况下对自己的代码有把握、不依赖编译器的特定行为反而成了优势。3. 典型题目解析与解题思路复盘3.1 字符串逆序的三种思路对比字符串逆序这道题很多人在笔试时直接被卡住或者写出了不完整的代码其实它的解法是有阶梯的。我建议你把下面三种写法都掌握笔试时根据要求灵活选择。第一种是最常见的“双指针原地交换”void reverse_string(char *s) { if (s NULL) return; char *left s; char *right s strlen(s) - 1; while (left right) { char tmp *left; *left *right; *right tmp; left; right--; } }这个写法的时间复杂度是O(n)空间复杂度是O(1)适合处理修改原字符串的场景。注意边界条件空指针要先判断空字符串时strlen(s)为0right初始是s - 1但不会进入while循环所以不会有问题但如果你先while (left right)再检查空字符串就会出错。第二种是递归逆序void reverse_string_recursive(char *s, int left, int right) { if (left right) return; char tmp s[left]; s[left] s[right]; s[right] tmp; reverse_string_recursive(s, left 1, right - 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否则链表就断了。这个逻辑我用一句话总结就是先记住后面再回指前面然后一起向前走。递归写法相对难理解一些但对理解递归思维很有帮助struct ListNode* reverseListRecursive(struct ListNode* head) { if (head NULL || head-next NULL) return head; struct ListNode *newHead reverseListRecursive(head-next); head-next-next head; head-next NULL; return newHead; }这个递归的关键在于递归反转完后面的链表后当前节点的下一个节点已经变成了反转后链表的尾节点所以head-next-next head这行代码就是把当前节点挂到新链表的末尾。理解这个递归你对链表的理解会上一个台阶。笔试时如果题目没有特别说明推荐使用迭代写法因为不容易栈溢出代码也不难写。如果你递归写法掌握得不太熟建议笔试前专门花半小时把递归版本的链表反转练熟。3.3 while与do-while的核心区别来自热搜的具体考点“C语言while和do-while的区别”这个热搜词出现在这里说明不少人在复习C语言时对循环结构依然有认知盲区。笔试中关于循环的考点通常会结合一个具体的执行结果来出题。核心区别一句话就能讲清楚while是“先判断后执行”do-while是“先执行后判断”。也就是说do-while的循环体至少会执行一次哪怕条件一开始就是假的。int i 5; while (i 3) { i--; } // 不执行i保持5 do { i--; } while (i 3); // 先执行一次i变成4再判断条件不满足结束这个区别在笔试中常考的变形是用while和do-while分别实现“至少执行一次”的流程比如用户输入校验场景。很多人在第一次写do-while循环时容易漏掉末尾的分号这是我判卷时遇到的最多的一种低级错误笔试提交前要仔细检查。3.4 冒泡排序的优化与变种排序算法是笔试的常客冒泡排序作为最基础的排序算法之一出现频率极高。但这份卷子如果单纯考基础的冒泡排序就太无聊了所以出题人通常会在冒泡排序的优化上做文章。基础版冒泡排序void bubble_sort(int *arr, int n) { for (int i 0; i n - 1; i) { for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int tmp arr[j]; arr[j] arr[j 1]; arr[j 1] tmp; } } } }但很多笔试题会问你如果给定的序列已经接近有序冒泡排序能不能提前退出优化思路是加一个标记位如果某一轮遍历中没有发生任何交换说明已经有序可以提前结束void bubble_sort_optimized(int *arr, int n) { for (int i 0; i n - 1; i) { int swapped 0; for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int tmp arr[j]; arr[j] arr[j 1]; arr[j 1] tmp; swapped 1; } } if (swapped 0) break; } }这个问题背后体现的是对算法时间复杂度的敏感度。最好情况下优化后的冒泡排序可以达到O(n)的时间复杂度而不是O(n²)。在笔试中能主动提出这个优化点会是一个不错的加分项。3.5 二分查找的边界处理技巧二分查找这道题看起来简单写全对的人真的不多。这份卷子里如果出现二分查找大概率会以“实现二分查找函数”的形式出现输入是一个有序数组和目标值返回目标值的下标如果不存在返回-1。int binary_search(int *arr, int n, int target) { int left 0, right n - 1; while (left right) { int mid left (right - left) / 2; if (arr[mid] target) { return mid; } else if (arr[mid] target) { left mid 1; } else { right mid - 1; } } return -1; }这里有三个容易踩的坑第一个是mid的计算方式。有些人写(left right) / 2这在left right可能溢出时会产生问题。虽然笔试的测试数据可能不会大到溢出但用left (right - left) / 2是一个更好的习惯面试官看到这种写法会认为你有安全意识。第二个是循环条件。用left right时意味着搜索区间是闭区间每次更新时left mid 1或right mid - 1是正确的如果写成while (left right)搜索区间就变成了左闭右开更新规则要相应调整。两种写法混用最容易出错。第三个是退出时区间的含义。循环结束后left指向的是第一个大于等于target的位置这个性质在某些变体题比如查找第一个不小于目标值的元素中非常有用。理解了这一点你就可以灵活处理各种二分查找变体题。3.6 C语言文件读写的常规考法与注意事项文件读写操作也是C语言笔试常考的工程类题目特别是当你投递的方向跟日志处理、数据上报有关时。“C语言文件读写操作代码”这个词频繁出现在高频搜索词里不是没有原因的确实有很多同学这块概念模糊。先看一个标准的文件复制函数实现int copy_file(const char *src_path, const char *dst_path) { FILE *src fopen(src_path, rb); if (src NULL) return -1; FILE *dst fopen(dst_path, wb); if (dst NULL) { fclose(src); return -1; } char buf[4096]; size_t bytes_read; while ((bytes_read fread(buf, 1, sizeof(buf), src)) 0) { fwrite(buf, 1, bytes_read, dst); } fclose(src); fclose(dst); return 0; }写文件操作代码时有几个细节笔试时出题人特别爱挖坑。第一个是忘记检查fopen是否成功这在文件中很容易产生空指针解引用的问题。第二个是打开文件成功后后续操作出错时忘记fclose导致文件句柄泄漏。第三个是中文环境下的编码问题读写文本文件时fread和fwrite是按字节操作的如果处理的包含中文字符的文本直接用char可能会出问题。我自己在笔试题里看到“文件读写”类的题目时通常第一眼会看两个地方缓冲区分配是否正确fclose是否覆盖所有返回路径。这两个点覆盖到了这道题基本问题就不大了。4. 常见问题与实操中的避坑指南4.1 笔试中最常见的丢分点综合来看C方向笔试题丢分最多的地方反而不是在那些“难题”上而在最基础的工程习惯上。我梳理了这几个高频丢分点你在笔试前一定要对照自查一下。第一是边界条件检查。很多人代码写得很漂亮主逻辑都对但空指针、空字符串、数组长度为1这些情况没有考虑导致测试用例没过。这个问题的根源是很多同学做题时习惯用“正常数据”验证代码而忽略了“异常数据”。笔试前可以专门训练自己写代码前先在草稿纸上列一下边界情况强迫自己养成习惯。第二是全局变量和局部变量作用域混淆。笔试中经典的出题方式是给一段代码让你说出输出结果。这类题里经常使用同名全局变量和局部变量考察你对C语言作用域规则的理解。正确做法是局部变量优先于全局变量但可以用::var或者extern等方式访问全局变量C中。第三是忘记释放内存。手写代码时如果你用了malloc但没写free在笔试中不会直接编译报错但面试官评分时一定会扣分。有些题目还会专门让你找出这段代码的问题内存泄漏就是标准答案之一。我在笔试前会反复提醒自己malloc与free必须配对fopen与fclose必须配对这样才不会在基础分上丢分。第四是手写代码时没有注意编译器的差异。爱奇艺的笔试环境通常是网页端的在线判题系统编译环境可能是Linux GCC也可能是其他的在线环境。你在本地用的是Windows VS Code MinGW这是导致“本地编译过了线上编译失败”的常见原因。这样看“vscode配置C/C环境”这个热词背后的痛点确实存在。为避免这个问题笔试时尽量不要依赖某个特定编译器特有的语法特性比如itoa函数是Windows环境特有的不是C标准库的一部分在某些在线环境中根本编译不过。4.2 针对爱奇艺C方向的高效备考路线如果你现在正准备爱奇艺或者其他大厂的C/C方向校招笔试我的建议是按下面的路线来准备优先级从高到低排列。第一步先把C语言的核心语法吃透。重点关注指针、数组、字符串、结构体、宏定义、位运算、动态内存管理等主题。所谓“吃透”不是说你背会了语法规则而是每道语法题你都能清楚说出底层的执行逻辑。比如为什么数组名在大部分情况下会退化为指针为什么结构体需要考虑内存对齐这些问题的答案不是“因为标准规定”而是涉及C语言与硬件/内存模型的深层关系。第二步刷算法题。算法刷题时建议按照“高频专题”来刷而不是顺序刷题。优先级最高的是字符串处理、链表操作、二叉树遍历、排序与二分查找、简单动态规划。对于校招笔试来说能达到“看到题目就能快速判断出解法并能在15分钟内手写运行不报错”的水平就够了。第三步补系统与网络基础知识。进程和线程、内存分配、进程间通信的几种方式、TCP的三次握手与四次挥手、HTTP与HTTPS的区别这些是简答题和场景题的高频考点。这些东西建议找一本经典的教材系统地过一遍而不是零散地看博客因为笔试里有时会从一个记忆点出发考察相关的多个层面你需要有一个完整的知识图谱。第四步针对爱奇艺的业务场景做冲刺。去了解爱奇艺的技术栈、视频业务的基本流程。比如视频上传之后经过转码、切片、加密、分发这几步每一步涉及什么技术。这种了解不一定会在笔试中直接考但在后面的面试环节会有很大优势。笔试部分如果出现了场景题大多数情况下是考察你对某个技术点的理解是否深入而不是考察你是否了解爱奇艺的具体业务。4.3 独家避坑笔试现场的答题策略和心态管理除了知识点之外我每次面试学员或朋友时都会强调笔试现场的答题策略。这部分网上很少有人系统聊但实际影响非常大。策略一先做会做的题最后再啃难题。这个原则听起来简单但真的有人因为是“第一题”就一上来卡了半小时。笔试题整体时间通常只有60到90分钟你需要合理分配。第一遍快速扫一遍全部题目把答案确定的题先做完大约拿到60%的基础分再回来啃有挑战的题。很多在线笔试系统在你提交整份卷子前可以反复修改利用这个机制先拿稳拿的分再拼高分。策略二代码题不要追求一步到位。先在草稿纸上写好伪代码理清思路后再往答题框里填。这样做有几个好处第一是避免思路混乱时在答题框里反复删改浪费时间第二是你可以在草稿纸上做边界条件的推演提高一次写对的概率第三是即使最后代码没写完草稿纸上清晰的思路也能在一定程度上证明你的能力虽然笔试系统看不到草稿纸但这种有条理的思考习惯会让你在做题中少犯低级错误。策略三填空题一定要冷静分析程序执行的流程。C语言程序执行中每一个变量的变化都可以像调试器一样逐步跟踪。建议用纸笔画出表格记录每个变量的值尤其是指针指向的地址和内容。这个技巧对“求输出结果”类的题目非常有效。策略四环境问题提前准备。笔试前一定先测试好你准备用的在线编译环境至少要清楚编译时是否默认加-Wall警告选项、是否启用C等。很多考生是在考试开始后才发现输入输出格式不对或者本地能运行的代码在线环境编译不了这些都是可以在考试前通过模拟测试避免的。5. 实操中我遇到的几个典型问题与处理方法5.1 为什么代码在本地能跑在线编译却报错这个是我见过最多的一个问题也是“vscode配置C/C环境”和“该版本的c\nvm4w\nodejs\node_modulesanthropic-ai\claude-code\bin\claude.e”这类热词背后真正的痛点。这两个热词指向的本质是很多同学在本地配置环境时用了特定工具链但缺少对“标准C/C”的了解本地能跑不代表代码符合标准也不代表它能在所有编译器上跑。最常见的例子就是依赖非标准头文件。比如#include conio.h这个头文件在很多在线判题系统上根本没有再比如#include windows.h这在Linux环境下都是找不到的。规避方式很简单做题时只用C标准库函数比如stdio.h、stdlib.h、string.h、math.h。如果题目本身没有提到平台相关的库就不要主动引入。第二个常见的坑是本地的main函数写成了void main()。这个写法在大多数本地编译器中都能通过但在严格遵循C标准的编译环境里main函数的返回值必须是int。那些本地没问题的代码换一个编译环境就报错很多时候就是这种问题。其次在线笔试通常没有调试器输出只显示标准输出。这意味着你不能用printf来输出调试信息调试信息会混进答案里导致判题错误。我见过太多人因为忘了删除调试输出导致一个简单的题目被判错。建议在答题框内写代码时最后把所有调试相关的输出都删掉。5.2 字符串函数使用时的安全陷阱C语言字符串相关的函数是笔试中最容易产生安全问题的地方。爱奇艺的笔试题如果让你实现一个strcpy或strcat的简化版本通常还会要求你考虑安全性。这里牵涉到的一个核心矛盾是C语言标准库中的strcpy、strcat、sprintf都是不检查缓冲区大小的一旦目标缓冲区不够大就会造成缓冲区溢出。工程上的建议是如果笔试题目允许尽量使用strncpy、snprintf这类带长度限制的函数。例如char buf[16]; snprintf(buf, sizeof(buf), %s, long_string);snprintf最多往buf里写15个字符留一个位置给\0不会溢出。sizeof(buf)在编译时是确定的所以这个写法是安全的。但要注意snprintf的返回值是“如果缓冲区足够大时应该写入的字符数”处理截断情况时仍然需要小心。还有很多人在写字符串拼接时直接用strcat而不是strncat这是非常危险的习惯。笔试中如果出现了“字符串拼接”或者“字符串逆序输出C”这类题目你如果能主动考虑到缓冲区边界问题在注释里标注出来这种“工程意识”会让面试官对你的评价提高一个台阶。5.3 位运算的快速技巧爱奇艺C方向笔试中有一部分题考的就是你对位运算的掌握程度。如果你想在C语言基础题上拿高分位运算是必须掌握的一项技能。这里我整理了几个高频的位运算技巧和对应的典型应用场景。判断一个整数是不是2的幂int is_power_of_two(int n) { return n 0 (n (n - 1)) 0; }这个技巧的原理是如果一个数是2的幂那么它的二进制表示中只有一个1而n - 1会把那个唯一的1变成0并把后面的所有位变成1两者按位与结果一定是0。交换两个整数值不使用临时变量a ^ b; b ^ a; a ^ b;这个技巧在中级面试中经常出现但我必须强调一句实际工程中建议使用临时变量因为可读性更好但笔试如果考到“用位运算交换两个数”你要写出上面的代码并且能说清原理。求一个整数二进制中1的个数经典题目int count_bits(int n) { int count 0; while (n) { n (n - 1); count; } return count; }这个技巧的原理就是利用n (n - 1)会消除掉n的最低位的1。循环多少次就说明有多少个1。位运算相关的题目理解了原理再写就直接了当比单纯背答案要稳妥得多。6. 从这份笔试题反推爱奇艺到底在找什么样的人拆完这份卷子之后我一直有一个强烈的感受爱奇艺的C方向笔试题表面上考的是知识点本质上其实是在筛选一种思维方式。它不追求你是个“算法神”但它要求你非常清楚自己写的每一行代码在机器里对应着什么样的行为。比如指针题它考的不是你会不会背指针规则而是你能不能通过指针的运作方式去思考内存当中到底是什么样的布局。字符串题它考的不是你会不会用strlen而是你能不能处理好隐藏在字符串末尾的\0。文件题它考的不是你会不会调用fopen而是你有没有“资源总是要释放的”这种意识。这套筛选逻辑和爱奇艺实际的技术需求是高度匹配的。一个视频转码服务要处理的是海量的二进制数据要操作的是极其讲究性能的编解码库要保证的是长达数日的服务稳定运行。如果写代码的人对指针的每一层间接引用都模模糊糊的对内存分配后是否释放都无所谓那写出来的服务在真实的生产环境中随时可能出问题。我从几个校招入职爱奇艺的同学那里了解到的后续面试也印证了这一点。笔试筛选出的是基础扎实、代码习惯好的候选人而后续的技术面试会围绕你做过的项目和实际中可能遇到的技术问题展开。对于校招生来说笔试通过就意味着面试官认为你的基础可以胜任接下来的工作。所以我建议不管你是不是真的打算投爱奇艺这份卷子里呈现出来的考察方向都值得认真研究一下。它代表了视频类互联网公司对C/C工程师的期望也代表了校招C方向笔试一个大致的难度基准。把这份卷子研究透了你对“大厂C语言笔试到底在考什么”这件事会有一个清晰的答案。在我自己刷这份卷子的过程中最大的一点感触是很多题看着眼熟但真正动手写起来才发现自己存在着不少知识漏洞。比如我平时写代码很少考虑结构体的内存对齐但笔试里它就是一个明确的考点平时用strcpy很顺手但问到为什么需要strncpy时需要认真思考一下才能给出完整的理由。这种“以为自己会了实际上没完全会”的状态是应届生笔试时最常见的隐形杀手。如果你现在离笔试还有一段时间那恭喜你你还有机会可以把这些基础问题彻底解决。我个人的建议是不要急着刷海量的题先花几周时间把C语言核心知识重新过一遍把每一个知识点都落到“能写代码验证”的层面。这样既能为笔试做准备也能为之后的高效刷题打下基础。面试中能写出优雅代码的人往往不是在刷题量上胜出而是在基础理解的深度上胜出。
返回列表