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

资讯详情

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

阿里巴巴2016研发工程师笔试题解析:基础能力自测清单

阿里巴巴2016研发工程师笔试题解析:基础能力自测清单 备战技术岗位笔试的人很多都听过阿里巴巴2016研发工程师笔试题一这套题。哪怕你并不是那年校招的应届生在牛客、知乎和各种题库里也大概率撞到过它。我当年刷题时把它当作风向标后来帮学弟学妹做模拟测评又回头翻过两次发现真正有价值的早就不再是那几道题的正确答案而是这套卷子体现出来的出题逻辑面试官把研发工程师日常最容易含糊、最容易出错的基础点全部收拢到一张试卷里考的不是你会背多少名词而是你看到问题后能不能准确判断它到底在问什么。这篇文章不打算把原卷答案搬运一遍那样意义不大。我会按技术模块拆一遍这类卷子的考察重心把数组和指针、C/Java底层机制、算法边界处理、操作系统与网络基础、数学逻辑题这几个高频板块逐一说透最后讲一讲刷题后应该怎么复盘才能真正把一套旧题转化成自己的知识体系。无论你准备校招还是跳槽都可以把这套题当作一次基础能力自测清单来用。1. 2016年这套笔试题为什么值得翻出来重做1.1 一套老题里藏着的筛选逻辑技术笔试和期末考试最大的区别是期末考要看绝对分数笔试看相对排名。阿里这类研发岗的笔试题量通常在30到40道之间时间90分钟左右题型以单选、多选、填空为主偶尔夹杂一两道简答。出题人有明确任务在有限时间内把候选人按能力拉开档次。所以题目设计不会追求把每个人都考倒而是要让基础扎实的人稳定得分、基础不牢的人凭感觉蒙题、蒙题的人又恰好踩中干扰项。2016年这个时间节点很有意思。那几年移动互联网还在高速扩张研发岗投递量非常大笔试承担的首要任务就是低成本过滤。过滤什么过滤那些简历写得漂亮但连数组和指针关系都说不清楚的人。因此你会发现这套题的考察重心非常偏向基础语言底层机制、数据结构经典操作、操作系统和网络的常见概念、数学逻辑题。它不是ACM竞赛题不会让你在考场上推导一个复杂的平衡树它要的是你作为一个研发工程师的基本盘稳不稳。我后来做模拟面试时发现很多候选人被淘汰不是因为难题不会而是基础选择题错得太多。特别是多选题目少选、错选、多选都不得分这种规则放大了半懂不懂的成本。所以刷这套旧题首要目的不是压中原题而是用它校准你的知识盲区。1.2 题量与时间分配笔试现场的第一道坎整套卷子看起来时间充足但如果按每道题1.5分钟算40道题就需要60分钟剩下的时间要分配给读题、画草稿和检查。真实考场上很多人会卡在一两道计算题上结果后面的简单题没时间做。我见过太多人栽在这里前面一道内存对齐的计算题算了五分钟出来一对答案还错了后面三道送分题却因为时间不够随便蒙。所以我的建议是做题顺序按语言基础 → 数据结构 → 数学逻辑 → 操作系统 → 网络来先把自己最有把握的模块吃掉再回头啃硬骨头。遇到需要复杂推导的题目先标记出来最后统一处理。这不是投机而是利用有限的90分钟把确定性最高的分数先拿到手。单选题和多选题的做题策略也不同单选题排除法很有效多选题则要谨慎拿不准的选项宁可少选如果规则允许部分得分也不要乱选。这套题放到今天还有一个特殊价值它是少见的、把C/C底层细节点考得比较密集的校招卷。现在的很多题库把大量精力放在Python和Java语法上反而忽略了数组与指针这类C语言核心概念。如果你投的是后台开发或者基础架构方向C/C底层能力往往决定了你的笔试排名。后面我把这几个方向逐个展开。2. 数组、指针与语言底层细节最容易拉开差距的题型2.1 数组名与指针那类必考辨析题数组和指针笔试题是搜索这套题时最高频的关联词不是没有原因的。在C/C里数组名和指针之间的关系是区分真正懂底层和只会写业务代码的经典试金石。这类题目表面问的是语法实际考的是内存模型。先说结论数组名在绝大多数表达式中会隐式转换为指向首元素的指针但有两个例外——sizeof运算符和取地址运算符。考卷里最常见的题型就是围绕这句话做文章。int arr[10]; printf(%zu\n, sizeof(arr)); // 40整个数组的大小 int *p arr; printf(%zu\n, sizeof(p)); // 864位机指针本身的大小 printf(%zu\n, sizeof(arr[0])); // 4单个元素的sizeof printf(%p\n, arr); // 数组首地址 printf(%p\n, arr); // 整个数组的首地址数值和arr一样 printf(%p\n, arr 1); // 首元素地址 4 printf(%p\n, arr 1); // 首地址 40跨过整个数组很多人在arr 1上翻车。arr的类型是指向长度为10的数组的指针也就是int (*)[10]所以加1之后跳过的不是一个int而是整个数组40个字节。如果把arr 1强转成int *它指向数组末尾之后的位置也就是经典的越界尾指针用法。还有一类必考题是数组作为函数参数时的退化。void foo(int a[]) { printf(%zu\n, sizeof(a)); // 8指针大小 }形参列表中的int a[]会退化为int *a在函数体内对形参做sizeof得到的是指针大小不是数组大小。这解释了为什么C语言里数组传参时必须同时传入长度否则函数内部无法知道数组边界。多维数组的退化规则更隐蔽。int a[3][4]作为函数参数时退化为int (*a)[4]也就是指向长度为4的int数组的指针。a[1][2]用指针等价写法是*(*(a 1) 2)。笔试里常考的就是把它和int **p区分开int (*)[4]和int **完全不是一回事前者指向一个二维数组的行后者指向指针二者的内层寻址方式不同。我踩过的坑是这类题目看起来简单但考场上极容易受干扰项影响。建议刷题时别只看这个选项对不对要把为什么其他选项错也分析一遍尤其是涉及const char *p和char * const p这种修饰符组合的题。记住一条口诀const修饰的是它左边紧挨着的类型如果左边没有类型则修饰右边const char *p中p可以改变指向的内容不能改char * const p中p不能改变指向的内容可以改。2.2 内存对齐、字节序与类型转换计算题的常规套路内存对齐是研发岗笔试的常客因为它在实际工程中直接影响结构体大小和性能。考察方式多半是给出一个结构体问你sizeof结果是多少。struct A { char a; // 偏移0 int b; // 需要4字节对齐偏移4 char c; // 偏移8 }; // 总大小对齐到4的倍数12字节 struct B { char a; // 偏移0 char c; // 偏移1 int b; // 需要4字节对齐偏移4 }; // 总大小8字节把char和int的声明顺序调整一下结构体大小就从12变成8。原因很简单int要求4字节对齐所以编译器在a后面插入3个填充字节让b落到偏移4的位置。B中两个char挨在一起占据偏移0和1b从偏移4开始不需要额外填充总大小8字节。工程启示是结构体字段按类型大小降序排列可以有效减少填充字节这在嵌入式场景里尤其重要。字节序大小端也是高频题。小端模式低字节存在低地址。判断方法很简单unsigned int x 0x12345678; unsigned char *p (unsigned char *)x; // 小端内存里是 78 56 34 12 // 大端内存里是 12 34 56 78如果考题说在某个地址看到0x78问机器是小端还是大端答案是小端。网络字节序是大端所以跨端传输数据时需要做转换这也是htonl这类函数存在的原因。类型转换题里最容易错的是整型提升和隐式转换。char和unsigned char在参与运算时都会先提升为int但如果转换方向是 int → unsigned int负数会变成一个很大的正数。比如int a -1; unsigned int b 1; if (a b) { // 这里不会执行因为-1被转换为无符号数后变成4294967295 }a b的结果是假因为int和unsigned int比较时a会被隐式转换为unsigned int。这种题目考的就是你有没有真正理解C语言的隐式转换规则而不是靠猜。2.3 C对象模型与Java内存细节语言题的多变面目阿里这类卷子还有一个特点C和Java会交替出现考察的是候选人有没有掌握至少一门语言的核心机制。C方向最喜欢考构造析构顺序、虚函数和拷贝语义。class Base { public: Base() { std::cout Base构造\n; } virtual ~Base() { std::cout Base析构\n; } }; class Derived : public Base { public: Derived() { std::cout Derived构造\n; } ~Derived() override { std::cout Derived析构\n; } }; int main() { Base *p new Derived(); delete p; }输出顺序是Base构造 → Derived构造 → Derived析构 → Base析构。构造时先基类后派生类析构时先派生类后基类。这是C继承的最基本规则也是考题里反复出现的点。另一个经典坑是如果基类析构函数没有声明为虚函数delete p只会调用Base析构函数Derived的析构逻辑不会执行导致资源泄漏。这就是为什么多态场景下基类析构函数几乎总是要写成virtual。Java方向的考察点则是String和包装类缓存。String s1 abc; String s2 abc; String s3 new String(abc); System.out.println(s1 s2); // true常量池复用 System.out.println(s1 s3); // falsenew出来的对象在堆上 System.out.println(s1.equals(s3)); // true比较内容比较引用地址equals比较内容。s1 s2为true是因为字符串常量池里只有一个abc对象。new String(abc)强制在堆上创建新对象所以和常量池里的对象地址不同。类似的还有Integer的缓存机制Integer a 127; Integer b 127; a b为true因为-128到127之间的整数会自动装箱进缓存超出范围就为false。这类知识点看一遍就记住了但如果没专门复习过考场上很容易凭直觉选错。我的经验是语言底层题不适合临时抱佛脚。如果你平时写的是Java不可能在考前一周内把C虚函数表彻底搞明白。正确的做法是提前一个月把目标岗位最常用的语言底层机制过一遍特别是那些平时不会直接写出来、但框架下面一直在运行的规则。3. 算法题里的高频模型与边界处理思路3.1 链表、数组题里的两个常用套路研发岗笔试题里的算法通常不会是复杂的高级数据结构而是链表、数组、二叉树这些基础结构上的经典操作。但越是基础结构越能考出边界意识。链表题里反反复复出现的就是反转链表、合并有序链表、找倒数第K个节点、判断是否有环。以判断链表是否有环为例标准解法是快慢指针快指针每次走两步慢指针每次走一步如果存在环两者必会相遇如果快指针走到nullptr说明链表无环。bool hasCycle(ListNode *head) { ListNode *slow head; ListNode *fast head; while (fast fast-next) { slow slow-next; fast fast-next-next; if (slow fast) { return true; } } return false; }这道题从数据结构课本到面试题解几乎无处不在。它考察的不是会不会写而是有没有处理空指针和快指针越界的意识。while (fast fast-next)这个条件的含义是只要快指针不为空且它的下一个节点也不为空就继续走。少了这个判断直接访问fast-next-next就会崩溃。数组题里最高频的是双指针技巧。比如有序数组去重、两数之和、三数之和都能用双指针把时间复杂度从O(n²)降到O(n)。两数之和最简单的做法是哈希表vectorint twoSum(vectorint nums, int target) { unordered_mapint, int mp; for (int i 0; i nums.size(); i) { int rest target - nums[i]; if (mp.count(rest)) { return {mp[rest], i}; } mp[nums[i]] i; } return {}; }笔试不会要求你写完整可运行的工程代码但会考察能不能想到哈希表以及如何避免重复使用同一个元素。这类题的训练价值在于它能帮你建立一种直觉看到查找相关的问题首先想哈希表看到有序数组想二分或双指针看到子串想滑动窗口。3.2 二叉树、堆与递归二叉树题目几乎必考遍历。前序、中序、后序、层序看起来基础但换个问法就能拉开差距比如已知前序和中序遍历重建二叉树或求二叉树最大深度。int maxDepth(TreeNode* root) { if (!root) return 0; return 1 std::max(maxDepth(root-left), maxDepth(root-right)); }这道题递归逻辑很简单但里面隐藏了一个高频考点递归终止条件。if (!root) return 0是必须的否则无限递归栈溢出。类似的还有二叉搜索树中序遍历有序查找时比较节点值与目标值大小决定走左子树还是右子树。堆的问题通常考察用数组实现堆或堆排序过程。比如给你一个无序数组要取前K大元素最经典的做法是维护一个大小为K的小顶堆priority_queueint, vectorint, greaterint pq; for (int x : nums) { if (pq.size() k) { pq.push(x); } else if (x pq.top()) { pq.pop(); pq.push(x); } } // pq中的元素就是前K大的元素小顶堆的堆顶是堆里最小的元素遍历时只要当前元素比堆顶大就替换堆顶。最后堆里剩下的就是最大的K个数。这道题在笔试和面试里出现率极高原因是它同时考察了数据结构选型和复杂度分析时间复杂度O(n log K)空间复杂度O(K)。刷算法题时我建议做一道题就对应到一种策略标签。链表、数组、二叉树、堆、哈希表、双指针、滑动窗口、动态规划每个标签下面积累几道经典题考试时看到题目先打标签再选择对应策略。这比一道一道孤零零地刷题有效得多。3.3 动态规划、贪心和复杂度边界动态规划在笔试选择题里多以递推关系式的形式出现而不是让你写完整代码。经典的爬楼梯问题每次可以爬1级或2级爬到第n级有多少种方法。答案是斐波那契数列的变体f(n) f(n-1) f(n-2)初始条件f(1)1, f(2)2。这种题目重要的是理解状态定义和转移方程。爬楼梯的状态定义为到达第n级的方案数转移依据是最后一次迈了1级还是2级。笔试选择题可能会给你四个转移方程选项让你选正确的那个。如果你只是背过代码没有理解为什么是f(n-1)f(n-2)很容易被干扰项带偏。贪心的典型题是区间调度给定若干区间选出最多的不重叠区间。解法是按区间结束时间排序然后贪心地选最早结束且不与已选区间重叠的。这类题的考点不是代码而是能不能判断出贪心策略的正确性。在笔试有限时间里你不需要写下严格的数学证明但要能凭直觉和反例测试判断贪心在排序类问题上通常有效而在需要全局组合的问题上需要动态规划。复杂度分析是另一类高频选择题。比如双重循环是O(n²)快排平均是O(n log n)哈希表插入删除平均是O(1)。但笔试题目不会这么直白它可能会问递归函数的时间复杂度这时就要能写出递推式再求解。比如归并排序T(n)2T(n/2)O(n)用主定理可得O(n log n)。如果不熟悉主定理也可以用迭代法手推一遍每层规模减半但层数为log n每层合并操作总复杂度为O(n)所以总复杂度O(n log n)。4. 操作系统、网络与Linux基础题的失分点4.1 进程、线程与死锁名词背后的判断操作系统是研发岗必考模块常考的点集中在进程线程区别、调度算法、死锁条件和虚拟内存。选择题喜欢用多选题形式考死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待。只要你记住了这四个条件题目本身不难。但还有一类更灵活的考法给出一个实际场景问你是否会发生死锁。比如两个线程分别持有一把锁同时等待对方释放另一把锁这就是典型的循环等待导致死锁。处理方式是加锁顺序保持一致或者用超时机制。进程和线程的区别也是老生常谈进程是资源分配的基本单位线程是CPU调度的基本单位。同一个进程内的线程共享地址空间所以线程间通信不需要内核介入但也带来了数据竞争问题。笔试里常考的还有孤儿进程和僵尸进程的区别父进程退出后子进程被init进程收养叫孤儿进程子进程退出后父进程没调用wait回收它的退出状态子进程残留成僵尸进程。页式内存管理是另一块重点。虚拟内存将进程地址空间映射到物理内存通过页表完成转换。页表项里有一个标志位表示该页是否在内存中不在时访问会触发缺页中断操作系统负责从磁盘换入。考题常问缺页率的决定性因素是什么答案是页置换算法和程序局部性。如果是FIFO置换可能产生Belady异常分配更多页框反而缺页更多而LRU置换不会。这个点听起来偏理论但理解它能让后续排查线上内存问题时思路清晰很多。4.2 TCP/IP与HTTP细节决定胜负网络部分的考察主要是TCP和HTTP。TCP三次握手过程客户端发送SYN服务端回复SYNACK客户端再发ACK。四次挥手主动方发送FIN被动方回ACK被动方再发FIN主动方回ACK。为什么握手三次而挥手四次因为握手时双方的SYN可以合并到一个包而挥手时被动方可能还有数据要发送不能立即合并FIN和ACK。这类问题在选择题里常被包装成判断哪个描述正确四个选项分别描述不同阶段的状态如果你对SYN_SENT、ESTABLISHED、FIN_WAIT_1、TIME_WAIT这几个状态没有清晰记忆很容易选错。HTTP题目则常考状态码和缓存机制。200表示成功301是永久重定向302是临时重定向403是禁止访问404是找不到资源500是服务器内部错误503是服务不可用。笔试里常见的是让你根据功能选择状态码比如用户未登录访问需要登录的接口服务器应该返回什么状态码通常选401未认证而不是403无权限。这个区别很微妙但研发岗必须理解。Cookie和Session的区别也经常考Session存在服务端Cookie存在客户端。HTTP是无状态协议服务端通过Session在服务端维护会话状态并通过Set-Cookie把Session ID发给客户端。现在很多项目直接用JWT做无状态认证但这不代表基础知识的考察会消失反而说明你更需要理解无状态协议的设计初衷。4.3 Linux常用命令与文件权限研发岗笔试基本绕不开Linux考察方式多为命令含义和文件权限计算。权限这块chmod 755 file表示owner有rwx权限7group有rx权限5others有rx权限5。对应数值r4、w2、x1。笔试选择题会给你一个ls -l的输出比如-rw-r--r--问这个文件的权限是几。答案是644因为owner是rw6group是r4others是r4。常用命令也经常被直接拿来考ps -ef查看进程top查看系统资源grep过滤文本awk处理列sed做文本替换find查找文件kill -9强制终止进程。如果题目问你如何查看端口8080被哪个进程占用答案可以是netstat -tlnp | grep 8080或lsof -i:8080。这些命令不要求你背参数表但至少要知道典型用法因为笔试里经常会以哪个命令能实现某功能的形式出现。管道和重定向也是常客。|把前一个命令的输出作为后一个命令的输入覆盖写入文件追加写入。笔试会问cat a.txt | grep error | wc -l做什么答案是统计包含error的行数。这个组合拳在实际排查日志时非常高频。我在带新人时经常强调操作系统和网络不能只背结论要通过实际操作验证。Linux命令在你自己的机器上跑一遍TCP状态机用netstat观察一次连接关闭过程记忆深度比背书高得多。笔试题目往往来自真实场景如果你只在考前突击概念考场上稍微换个问法就会卡住。5. 数学逻辑题的高效速算与现场判断5.1 排列组合与概率题固定套路要先想清楚数学逻辑部分阿里这类笔试喜欢放两三道排列组合或概率题用来考察逻辑推理和计算能力。典型的考法是从5双不同的鞋子中任取4只求恰好有一双的概率。解法分两步先算总的取法数是C(10,4)再算恰好有一双的取法数。恰好有一双意味着选中的4只鞋子里有2只来自同一双另外2只来自两双不同的鞋子。取法数是先选配成对的那双有C(5,1)种再从剩下4双中选2双C(4,2)种最后从选出的2双中各取1只有2×2种。总的分母C(10,4)210分子C(5,1)×C(4,2)×45×6×4120概率为120/2104/7。这类题的关键不是计算而是用组合思想把事件拆解清楚。很多人一看到概率题就慌其实把事件过程分解成选哪双、选哪只之后计算就机械了。如果选择题里有足够接近的选项你可以先估计一下量级概率通常不会超过1排除明显大于1的干扰项再精确计算。还有一类常见的抽球问题袋中有a个红球、b个白球不放回抽取求第k次抽到红球的概率。结论是a/(ab)和第几次抽取无关。这个结论反直觉但可以用对称性理解不放回抽取时每个位置抽到红球的概率相同。你要是能记住这个结论考试时可以直接选答案省下大量推导时间。5.2 数列规律与逻辑推断别陷进去数列题在技术笔试里已经不如早些年了但仍然会出现。常见的有等差数列、等比数列、斐波那契变体、差分数列。看到数列先算相邻差值如果差值不成规律再算二阶差值还不成规律考虑递推关系比如前两项之和等于第三项之类的变体。这类题容易让人陷进去。我在实际刷题中总结的纪律是一道数列题如果两分钟内看不出规律立即放弃或蒙一个绝不恋战。原因很简单逻辑题一共没几分在一道题上耗十分钟会直接影响后面的算法题得分。先跳过做完整个卷子再回头很多时候换了视角反而能看出来。逻辑推断题常考真假话问题某算法题有4个候选人做完了只有一个人说真话问谁做的。解法是找矛盾命题。如果两个人的说法互相矛盾那么其中必有一真一假再结合只有一个人说真话的条件可以确定其余人的说法都是假话从而推出答案。这类题目考察的不是知识而是结构化推理能力。做题时可以在草稿纸上列出如果某人是答案那么谁真谁假逐一验证4种情况往往比空想要快。5.3 数学题的考场节奏用草稿纸管理注意力数学题是我在笔试时最容易上头的部分。因为计算有明确结果一旦开始推就有一种马上就能推出来的错觉然后时间就没了。后来我给自己定了一个硬性规则数学逻辑题放在试卷的中后段做且每道题不超过3分钟。草稿纸的使用也很关键。不要在一张纸上乱七八糟地写而是每一道计算题都标注题号从上往下、从左往右写。这样万一后面想检查能快速找到原始计算过程而不是重新推一遍。我用这个方法后检查效率明显提高因为很多低级计算错误在重新看草稿时一眼就能发现。另外对概率题里的常见答案要形成直觉。比如抛硬币直到出现正面平均需要抛多少次答案是2两个骰子点数之和为7的概率答案是1/6。这些经典结论在考场上可以直接套用省下的时间留给需要逐步推导的题。6. 刷完题之后的复盘方法把答案真正变成能力6.1 把题目按知识点聚类而不是按套卷复习很多人刷题的模式是做完一套对答案把错题背下来接着做下一套。这样效率很低因为知识点在脑中是零散的。正确的做法是按知识点聚类做完2016年阿里这套题后把所有错题按标签分类——数组和指针、C对象模型、算法复杂度、TCP状态、Linux权限、排列组合等等。分类之后你会看到自己的薄弱点分布。如果你的错题集中在C对象模型接下来两周就应该集中刷这个方向的题目而不是继续做新的套卷。比如先搞懂构造析构顺序再搞懂虚函数表和动态绑定最后搞懂拷贝构造函数为什么需要深拷贝。这个知识点地图式的方法比按顺序刷十套题有效得多。我常用的一个操作是把每道错题改造成三个问题——知识点是什么我当时为什么选错正确的分析路径是什么这三个问题写在同一个卡片上。当错题足够多时你就能发现自己的思维习惯问题比如总是对多个选项犹豫看到『一定正确』的绝对化表述就选了低估了类型转换的影响。6.2 错题笔记的正确字段错题本不是把题目和答案抄一遍就完了。我建议每个人的错题笔记包含五个字段题目来源、知识点标签、错误选项及原因分析、正确思路、纠错验证。错误选项及原因分析这一栏是最关键的。比如你做错了一道数组和指针的题错误原因不是我不认识这个代码而是我把sizeof数组的语义记混了。只有把错误原因具体到某一个概念节点才能在后续复习时有针对性地查缺补漏。纠错验证的本意是改完错题后不只是看一遍正确答案而是把相关知识点的变体也写下来自己验证是否真的懂了。比如错的是arr 1的语义就顺手写一个int (*p)[10]的定义再写出指向二维数组某一行和某一列时指针加减的规则。能默写出来才算真正掌握。这套2016年的题里有很多知识点直到今天仍然是技术面试的高频考点。如果你只是记住答案那这些内容在笔试之后就会被忘光如果你按知识点重新构建了一遍它会在你后续写代码、排查问题时持续产出价值。6.3 从笔试到面试的迁移旧题的新用法最后说一个我个人的经验同一套旧笔试题目刷完之后不要立刻删掉。把它当作模拟面试的题库来用。比如让朋友或自己随机抽一道题在一分钟内说出考察的知识点、可能的错误选项、以及为什么其他选项不对。这个训练看起来简单实际做起来会发现很难。因为会做选择题和能讲清楚题目背后的原理之间隔着很大一段距离。如果你能对着一个不懂的人把为什么int a[]作为函数参数时退化为指针讲明白那才是真正掌握了。从2024年往回看很多公司研发岗的笔试风格已经变得更多样有的加入系统设计选择题有的加入场景题。但基础题部分从未消失只是换了一身外衣。2016年阿里这套笔试题最大的价值不是让你押中原题而是给了你一个极好的基础能力刻度尺——哪个知识点含糊、哪个概念靠蒙做一遍就知道。如果你正在准备研发岗的校招或社招可以找一套最近一两年的真题再配一套2016年这种难度适中的基础卷交叉着刷。旧题用来打底新题用来测趋势。两种都做透了笔试通过率自然会上去。
返回列表