news 2026/8/30 15:01:47

腾讯2016研发笔试题复盘:C/C++、操作系统与网络考点全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
腾讯2016研发笔试题复盘:C/C++、操作系统与网络考点全解析

腾讯2016研发工程师笔试题(二):这份卷子到底在考什么,以及我复盘后悟出的解题套路

每年校招季,总有读者在后台问我:腾讯研发工程师的笔试题到底该怎么准备?老实说,单独刷“某一年真题”的意义不大,但如果你拿到的是2016年那一批(二)卷,认真拆一遍反而很有价值——因为那一年的题目风格非常典型:不考偏题怪题,四平八稳地覆盖了C/C++内存布局、指针与数组的纠缠、操作系统进程与线程、TCP协议细节、数据结构的复杂度边界。换句话说,它考的不是你背了多少API,而是你对计算机基础到底有没有“真的懂”。

这篇文章我就以2016研发工程师笔试题(二)为线索,把这份卷子背后涉及的考点掰开揉碎讲一遍。无论你是正在准备校招的应届生,还是工作几年想回头补基础的工程师,这篇文章都能帮你建立一套“看到题目就知道它在考什么”的反射框架。

1. C/C++指针与数组:2016年那批题里最阴险的“送分题”陷阱

先说一个我在复盘时印象最深的点:这份卷子C/C++部分的题目,表面看全是基础,实际上处处埋雷。尤其是指针和数组的关系,几乎每年必考,而2016年(二)卷里的相关题目,恰恰是区分“背过书”和“真会”的分水岭。

1.1 sizeof、strlen与数组名退化:一个字节数引发的血案

当年的选择题里有一道非常经典的题:定义一个字符数组char str[] = "Hello",问sizeof(str)strlen(str)分别是多少。看起来简单,但很多人会栽在“数组名什么时候退化成指针”这个点上。

sizeof(str)在数组定义所在的作用域内,返回的是整个数组占用的字节数。"Hello"是字符串字面量,末尾隐含一个\0,所以数组实际大小是6个字节。而strlen(str)是运行时函数,它从首地址开始数,一直到遇到\0为止,所以返回值是5。

如果是void func(char arr[]),在函数参数里char arr[]char* arr是完全等价的,此时sizeof(arr)返回的是指针大小(64位平台是8字节,32位平台是4字节),而不是数组大小。这是数组名退化的典型场景:数组名作为sizeof的操作数时不退化,作为函数实参时退化成指向首元素的指针,作为表达式参与运算时也退化。

很多人在笔试里写错,不是因为不知道sizeofstrlen的区别,而是没搞清“数组名在什么场景下不退化”。我复盘2016年这道题时,专门把这三种情况列了一遍:

场景数组名行为sizeof结果
数组定义作用域内代表整个数组整个数组字节数
函数参数传递退化为指针指针大小
表达式运算退化为首元素地址按指针处理

这里的关键是:sizeof是编译期运算符,它在编译时就能确定结果;而strlen是库函数,必须在运行时扫描内存。理解这一点后,你就能推断出sizeof不会触发数组名退化,因为它压根不需要知道数组首地址,只需要知道类型。

1.2 指针运算与二维数组:*(a+1)[2]这类表达式怎么拆

2016年(二)卷里还有一道让我印象深刻的二维数组题,大意是定义int a[3][4],问*(a+1)[2]或者*(*(a+1)+2)这类表达式的值是什么。这种题的本质是考察:aa[0]&a[0][0]在类型上有什么区别。

核心规律只有一条:数组名在表达式中退化指向首元素,而二维数组的首元素是a[0]a[0]又是一个一维数组。所以:

  • a的类型是int (*)[4],即指向包含4个int的一维数组的指针;
  • a+1指向a[1],也就是整个第二行;
  • *(a+1)取出第二行这个数组,类型退化为int*,指向a[1][0]
  • *(a+1)+2就是在第二行内偏移2个int,指向a[1][2]
  • *(*(a+1)+2)最终取出a[1][2]的值。

最容易错的写法是*(a+1)[2]。这里要特别注意运算符优先级:[]的下标优先级高于*解引用,所以*(a+1)[2]实际上等价于*((a+1)[2]),即先做下标运算(a+1)[2],这等价于a[3],再解引用就是a[3][0]。这已经越界了——a[3]超出了a[0]a[2]的范围。

我在给新人讲这道题时,都会强调一个习惯:遇到复杂表达式,先画括号,再翻译成“指针往哪走、走几步”。不要试图心算,笔试时草稿纸上画一个二维数组的内存格子图,比什么都管用。

1.3 笔试题里的C++对象模型:内存布局与虚函数指针

2016年(二)卷的C++部分,考了一道带虚函数的类继承题。这类题考察的核心是C++对象模型:一个对象的内存布局是什么样的,虚函数指针放在哪里,多重继承时怎么偏移。

简单说,一个类如果含有虚函数,编译器会给这个类生成一张虚函数表(vtable),每个对象里自动增加一个虚函数指针(vptr)指向这张表。对象的内存布局通常是:vptr在最前面(低地址),然后是成员变量。继承时,如果子类覆盖了父类的虚函数,子类的vptr指向的虚函数表里,对应表项会被替换为子类的实现。

笔试中常见的考法有两种:

  1. sizeof一个含有虚函数的对象是多少。比如一个类有int avirtual void f(),在64位平台下,int占4字节,vptr占8字节,由于对齐,对象大小是16字节(不是12字节,因为要对齐到8字节边界)。
  2. 问通过基类指针调用虚函数时,实际调用的是哪个版本。这考察的是动态绑定:如果函数是虚的,调用走vptr查表;如果不是虚的,编译期根据静态类型决定。

这类题目说难不难,但很考验你有没有真正读过对象布局。我建议备考时拿gcc的-fdump-class-hierarchy编译选项,把类的布局dump出来看一眼,一目了然。比死记硬背“vptr在对象头”要可靠得多。

1.4 复盘心得:为什么C/C++在腾讯笔试题里占比这么重

从2016年这批题目来看,C/C++相关考点占了近三分之一的分值。这和腾讯的技术栈选择有直接关系——很多底层组件、网络框架、游戏引擎都是用C/C++写的,研发工程师如果连内存和指针都玩不转,后续培养成本会非常高。

所以笔试阶段他们就会用这些“基础但易错”的题目做过滤。备考时不要只刷LeetCode,一定要专门补一遍C/C++的语言细节,特别是《深入理解计算机系统》第三章+《C++ Primer》的前半部分,把指针、数组、内存布局、虚函数这几块彻底吃透。

2. 操作系统与Linux:进程、线程与内存分布,这些知识点是2016年卷子的“半壁江山”

如果说C/C++是腾讯笔试的第一大考点,那操作系统绝对能排第二。2016研发工程师笔试题(二)里,进程与线程、内存管理、死锁、Linux命令这些题目大概占了四分之一。这一节我重点复盘几类高频题目和它们背后的原理。

2.1 进程和线程:一个fork()出来的问题,能绕晕多少人

我记得那份卷子里有一道典型的fork题:程序一开始调用一次fork(),然后父进程和子进程分别再调用一次fork(),问最后总共有多少个进程。这种题考察的核心是fork的语义:fork调用一次,返回两次,父进程返回子进程PID,子进程返回0

解题的正确姿势是画进程树。假设进程P0开始:

  • P0调用第一次fork,产生P1,此时进程数变为2;
  • P0和P1各自继续执行到第二次fork,P0产生P2,P1产生P3,进程数变为4。

所以答案是4个进程。但实际笔试题目会比这个复杂,比如可能在fork之后还有if分支,子进程和父进程走不同的代码路径,或者嵌套多个fork。这时候唯一可靠的方法就是逐层画树,不要试图心算。

还有一个高频考点是fork之后变量是否共享。很多人以为fork出来的子进程和父进程共享所有变量,这是错的。fork采用的是写时拷贝(COW)机制:刚fork完时,子进程和父进程确实指向同一份物理内存页,但只要有一方尝试写入,内核就会为它分配新的物理页并拷贝内容。所以从程序员的视角看,fork之后父子进程的地址空间是隔离的,子进程对变量的修改不会影响父进程。

我在讲解时会用一个生活化的类比:fork就像复印一份文档,复印完两人各拿一份,你用笔在你的复印件上写东西,不会影响我手上的原件。虽然底层在写之前其实是共享同一张纸,但你一落笔它就自动复制了。这个机制理解透了,遇到“fork后的全局变量”这类题就永远不会错。

2.2 同步与互斥:信号量、互斥锁和死锁的四个必要条件

2016年卷子里有一道经典的生产者消费者问题,要求用信号量写出伪代码,并解释为什么这样设计可以避免死锁和竞态。

这类题的解题框架是固定的:生产者要“先申请空缓冲区信号量,再申请互斥锁”,消费者要“先申请满缓冲区信号量,再申请互斥锁”。这里有一个容易忽略的细节:为什么必须先申请资源信号量、后申请互斥锁?因为如果把顺序反过来——先锁缓冲区,再等空位——一旦缓冲区满了,生产者会拿着锁阻塞等待,消费者又进不去缓冲区消费,就死锁了。

死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待——是必背内容,但更重要的是遇到题目会判断。比如“两个线程各自持有一把锁,然后尝试获取对方的锁”,这就是典型的循环等待。再比如“银行家算法”的题目,考察的是如何通过资源分配的安全性检查,避免系统进入不安全状态。

我在做这道题复盘时,最深的体会是:笔试里考死锁,从来不直接问“什么是死锁”,而是给出一个并发场景,让你分析是否可能死锁,或者让你写出不会死锁的同步代码。所以备考时要多看经典并发场景:生产者消费者、读者写者、哲学家就餐,每一道都要能独立默写伪代码,并说清楚每个信号量初始值为什么是这个数。

2.3 Linux基础命令与系统编程:笔试中“题面最短、信息量最大”的部分

2016年(二)卷的Linux题也很有意思,比如给出某个命令的执行结果,让你反推命令是什么;或者问某个命令的某个参数是干嘛的。这类题本质考的是经验积累,不抱佛脚很难拿分。

高频的Linux命令考察点包括:

  • grep:文本搜索,常配合-v反选、-E扩展正则、-r递归搜索;
  • awk:按列处理文本,awk '{print $1, $3}'这种是最基础的;
  • sed:流编辑器,笔试常考s/old/new/g这种替换语法;
  • pstop:进程查看,ps -eftop -H(显示线程)是出现过的高频写法;
  • netstat/ss:端口与连接状态查看,笔试喜欢让你找出监听某个端口的进程;
  • chmod:权限修改,chmod 755 file的含义要含得清清楚楚。

我见过太多人在笔试里挂在这类题上,原因不是不会Linux,而是没有系统整理过命令的常用参数。这里我建议准备一个在线速查表,把所有高频命令、高频参数记一遍,不用背全部,但常见的几十个参数一定要看到就能说出用途。

2.4 内存管理:栈、堆、全局区、常量区,一个对象到底活在哪个区

操作系统和C/C++经常被放在一起考的一个点是内存分区。2016年卷子里有一道题,给了一段代码,问某个变量、某个指针、某个字符串常量分别存在哪个区域。

这里我总结一套通用判断流程:

  1. 如果是函数内定义的普通局部变量,在栈区(stack)
  2. 如果是malloc/new申请的,在堆区(heap),指针变量本身在栈上(如果指针是局部变量的话);
  3. 如果是函数外的全局变量或static修饰的变量,在全局区/静态区(.data段或.bss段)
  4. 如果是字符串字面量,一般在只读常量区(.rodata),编译器通常会把它们放到只读段。

有一个经典误区需要特别提醒:char *p = "hello"char arr[] = "hello"完全不同。前者p指针在栈上(假设是局部变量),但它指向的字符串字面量在只读常量区,试图p[0] = 'H'会触发未定义行为,通常是段错误;后者arr是栈上数组,字符串内容被拷贝到栈里,修改arr[0]是合法的。

这一类题在笔试中属于“一分都不能丢”的基础题,但丢分率极高。复盘2016年这批题目时,我发现错误几乎全部出在“没区分指针变量本身和它指向的内存区域”上。记住:指针变量自己的位置和它指向的位置是两回事,答题时分开判断

3. 计算机网络与数据结构:腾讯笔试题里最“实用”的一趴,考的是你写没写过真实代码

2016研发工程师笔试题(二)里的网络题和数据机构题,我个人认为是整份卷子里性价比最高的部分。为什么?因为网络题只要你理解TCP/IP的分层思想,很多题可以从原理上推导出来,不需要死记硬背;而数据结构题只要刷过一定量的LeetCode,基本都能找到思路。

3.1 TCP三次握手与四次挥手:不只是背状态,还要理解为什么

腾讯笔试的网络题,几乎每年都会考TCP。2016年(二)卷里有一道连线题,要求把TCP连接建立和断开过程中的状态变换排序。本质上考的就是三次握手和四次挥手的状态迁移。

三次握手:

  1. 客户端发送SYN,进入SYN_SENT状态;
  2. 服务端收到SYN,回复SYN+ACK,进入SYN_RCVD状态;
  3. 客户端收到SYN+ACK,回复ACK,进入ESTABLISHED状态;服务端收到ACK后也进入ESTABLISHED

四次挥手:

  1. 主动关闭方发送FIN,进入FIN_WAIT_1
  2. 被动关闭方回复ACK,进入CLOSE_WAIT;主动方收到ACK进入FIN_WAIT_2
  3. 被动方发送完数据后发送FIN,进入LAST_ACK
  4. 主动方回复ACK,进入TIME_WAIT(等2MSL后关闭);被动方收到ACK后进入CLOSED

很多资料只让背状态名,但笔试真正想考察的是你是否理解:为什么挥手需要四次而不是三次?因为TCP是全双工的,每个方向上的连接必须单独关闭。发送FIN只表示“我这边没有数据要发了”,但不代表“我不接收你的数据了”,所以被动方要先ACK,等自己的数据发完再FIN。

还有一种更细的考法:为什么主动关闭方要进入TIME_WAIT并且等2MSL?原因有两个:一是确保最后一个ACK能被对方收到,如果丢了可以重发;二是让旧连接的所有报文在网络中自然消失,避免干扰后续使用相同端口的新连接。这个“为什么”比状态名本身重要得多,答题时如果能写出来,就是加分项。

3.2 HTTP与状态码、Session与Cookie:研发工程师必须张口就来的基础

2016年的网络题还有一个高频方向是HTTP。我记得有一道题给了几个HTTP状态码,让选出含义错误的项。这要求你对常见状态码非常敏感:

  • 200 OK:请求成功;
  • 301 Moved Permanently:永久重定向;
  • 302 Found:临时重定向;
  • 304 Not Modified:资源未修改,可使用缓存;
  • 401 Unauthorized:未认证;
  • 403 Forbidden:已认证但无权限;
  • 404 Not Found:资源不存在;
  • 500 Internal Server Error:服务器内部错误;
  • 502 Bad Gateway:网关错误;
  • 503 Service Unavailable:服务不可用。

另外一道题考察Session和Cookie的区别。这类题在研发岗笔试里几乎属于送分题,但并不保证每个人都拿得到。核心区别是:

维度的对比CookieSession
存储位置浏览器端服务器端
安全性较容易被篡改较安全
大小限制单条约4KB取决于服务器配置
生命周期可长期存在一般随会话结束失效

衍生考法:如果一个系统部署了多台服务器,Session存在单机上会导致用户请求被负载均衡到其他机器时Session丢失。解决方案包括Session共享、Sticky Session、或者把Session数据放到Redis等外部存储。这类分布式场景题在2016年之后的笔试题里越来越常见。

3.3 数据结构复杂度与典型算法:从排序到二叉树,边界条件才是判分点

2016研发工程师笔试题(二)的数据结构部分,至少有一道排序算法选择/复杂度计算题,以及一道二叉树相关题。

排序算法的高频考点是:各排序算法的平均/最坏时间复杂度、空间复杂度、稳定性,以及适用场景。这里我建议准备一张表,笔试前过一遍:

排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定吗
冒泡排序O(n^2)O(n^2)O(1)稳定
快速排序O(n log n)O(n^2)O(log n)不稳定
归并排序O(n log n)O(n log n)O(n)稳定
堆排序O(n log n)O(n log n)O(1)不稳定
插入排序O(n^2)O(n^2)O(1)稳定
希尔排序约O(n^1.3)O(n^2)O(1)不稳定

快排的最坏情况是每次选的基准都是最大或最小值,导致划分极不均衡。一个进阶考点是:如何在数据基本有序时避免快排退化?常见方案是随机选择基准,或者在小区间内改用插入排序。如果笔试问“数据量很大但内存不够,应该用什么排序算法”,答案通常是归并排序(外部排序的基础),因为它可以分块读入、逐层合并。

二叉树的题目也很有代表性。比如给定前序遍历和中序遍历,要求重建二叉树并输出后序遍历。这个题我从2016年一直看到现在,每年都有类似版本。解法不复杂:前序遍历的第一个节点是根,在中序遍历里找到根的位置,左边属于左子树,右边属于右子树,然后递归。关键是把边界条件写对——递归时左子树的区间是[inStart, rootIndex-1],右子树是[rootIndex+1, inEnd],别把端点搞混。

3.4 算法题里的“隐藏要求”:复杂度和边界条件的表达质量也是评分项

我复盘2016年这批笔试时注意到一个现象:腾讯的算法题通常不要求写完整可运行的工程代码,但会给出一定的伪代码空间。这意味着你可以用伪代码表达,但必须在注释或关键步骤中体现出对时间复杂度和边界条件的理解。

比如一道经典题:找出一个数组里出现次数超过一半的数字。常规思路是排序后取中位数,时间复杂度O(n log n)。但这道题的最优解是Boyer-Moore投票算法,时间复杂度O(n)、空间复杂度O(1)。如果你在规定空间里写出了这个解法,并且在代码里说明“因为候选值要么是目标值,要么可以被其他值抵消”,面试官是能看出来你真的懂这块知识点的。

另外,边界条件一定要单独处理,比如数组为空、只有一个元素、不存在超过一半的数字等。很多人在LeetCode上刷题时习惯主函数只跑happy path,笔试里就会漏掉这种用例。我的建议是:每次写完算法题,花30秒列出所有边界输入,在注释里写明你的代码是怎么处理它们的。这是性价比极高的加分项。

4. 沙盘推演:用2016年(二)的几道经典题,完整走一遍解题链路

这一节我想换一种方式来做复盘:不再按知识点逐个讲,而是选取几道我记忆中2016年(二)卷里非常有代表性的题目,按照“读题->识别考点->设计解法->易错点”这个链路完整推演一遍。这样你也能看到,我在拿到一道题时是怎么思考的。

4.1 一道C语言综合题:从变量定义到内存分区,考的是系统思维

题目大概是这样的:写出下面代码中a、p、str、ptr等变量或常量分别存储在哪里,以及它们的值。

#include <stdio.h> #include <stdlib.h> int global_var = 10; static int static_var = 20; int main() { int local_var = 30; int *ptr = (int *)malloc(sizeof(int) * 4); char *str = "hello"; char arr[] = "world"; static int local_static = 40; return 0; }

识别考点:这里考的不只是一个内存分区,而是多个内存区域的综合判断。

推演过程:

  • global_var是全局变量,有初值,存储在.data段;
  • static_var是静态变量,有初值,也存储在.data段,虽然它在文件作用域但加上static不影响存储位置,只影响链接可见性;
  • local_var是局部变量,存储在栈区;
  • ptr本身是一个局部指针变量,存储在栈区;但它指向的malloc分配的内存,存储在堆区;堆内存未初始化,里面是随机数据;
  • str是局部指针变量,存储在栈区;它指向的字符串常量"hello"存储在只读数据段.rodata
  • arr是局部数组,数组名代表栈上的一块连续内存,内容是从只读区拷贝过来的"world",注意arr本身在栈上;
  • local_static是函数内静态变量,存储在.data段(或.bss,取决于是否有初值)。

易错点:最容易错的是char *str = "hello"char arr[] = "world"的区别;其次是忘了ptr变量本身在栈上,而不是在堆上。很多人一看到malloc就条件反射地写“堆”,但题目问的是指针变量自身的位置,不是指向的位置。答题时最好在题目旁边画一个简易的内存分区图,把每个变量都标进去,基本不会错。

这道题我的经验是:遇到“变量存储位置”的题目,先画栈、堆、全局区、常量区四个方块,然后逐个变量归类,不要凭记忆直接写答案,否则很容易在细节处丢分。

4.2 一道网络综合题:TCP状态诊断与连接管理

另一道让我印象深刻的题目是给出一段TCP连接的抓包截图,包含状态和序列号的转换,要求判断连接是否正常建立,以及序列号的含义。

识别考点:TCP连接建立过程中序列号和确认号的语义。

推演过程:

  • 客户端发送SYN,序列号假设是x,不带数据包;
  • 服务端回复SYN+ACK,序列号为y,确认号为x+1;
  • 客户端回复ACK,确认号为y+1。

这里有一个高频考点:为什么确认号是对方序列号加1?因为在SYN报文里,SYN标志位本身要消耗一个序列号,所以即使没有携带数据,确认号也要在对方初始序列号基础上加1。这个细节如果不懂,后面做TCP重传和滑动窗口题目时很容易出错。

这类题目还经常结合netstat输出,让你根据某个端口的状态判断连接处于什么阶段。比如看到TIME_WAIT状态的连接很多,说明主动关闭方的连接正在等待2MSL超时,属于正常现象;但如果你发现CLOSE_WAIT大量堆积,就要赶紧查一下应用是否没有正确关闭socket。

易错点:很多人会混淆CLOSE_WAITTIME_WAIT。这里我提供一个记忆技巧:CLOSE_WAIT是被动关闭方等待自己应用层调用close的状态,TIME_WAIT是主动关闭方在发完最后一个ACK后等待的状态。谁的机器上什么状态多,往往能反推出谁是主动方、谁是被动方、毛病出在哪个环节。

4.3 一道数据结构题:给前序和中序遍历,重建二叉树

题目:已知一棵二叉树的前序遍历序列为ABDCE,中序遍历序列为DBACE,求后序遍历序列。

识别考点:二叉树的遍历序列与树结构重建。

推演过程:

  1. 前序遍历第一个字符是A,所以根节点是A;
  2. 在中序遍历DBACE中找到A,左边是DBC(没有左子树的前半部分),右边是CE?不对,中序是D B A C E,所以A左边是DB,右边是CE;
  3. 前序第二个字符是B,它在A的左子树根节点,所以B是A的左孩子;
  4. 中序DB中,B左边是D,所以D是B的左孩子;B右边为空,没有右孩子;
  5. 前序接下来是D,验证了D是B左孩子;然后是C,说明A的右子树根是C;
  6. 中序CE中,C左边为空,右边是E,所以E是C的右孩子;
  7. 后序遍历顺序是左->右->根,所以结果是D B E C A。

易错点:如果中序序列中某个节点的左右子树顺序判断错误,后面整个树都会重建错。特别是当某个节点只有左子树或只有右子树的时候,很容易把空的位置搞混。我的习惯是每确定一个节点,就在两个序列里把该节点划掉,然后划分子树区间,这样不容易乱。

这类题目在笔试中属于“看起来复杂但实际有固定套路”的题型。只要掌握了递归划分区间的思想,刷两三道类似的题就能完全掌握。

4.4 从这几道题看腾讯出题逻辑:基础、原理、边界三者缺一不可

推演完这三道题,你会发现腾讯的笔试题有一个明显特征:题目本身不超纲,但考察方式非常强调原理和边界。它很少让你从零写一个红黑树或实现一个线程池,而是给你一个看似简单的场景,考察你是不是真的理解背后的机制,以及能不能处理正常情况之外的边界。

所以备考时不要只追求“刷了多少题”,而要对每一个知识点问自己三个问题:

  1. 它的底层原理是什么?
  2. 它的边界条件是什么?
  3. 如果我在真实系统里写这段代码,哪里最可能出bug?

如果你能对大纲里的核心知识点都回答出这三个问题,那无论笔试题怎么变,你都不会慌。

5. 实战复盘总结:备考这道卷子,我的时间分配和资料建议

最后分享一下我在备考腾讯2016研发工程师笔试题(二)这类试卷时,实际采用的时间分配和资料选择。这套思路也适用于其他大厂以基础为主的笔试题。

5.1 时间分配:按分值比重倒推复习优先级

如果你手头有一份历年真题,最科学的做法不是顺着做,而是先统计考点分布,再按分值倒推复习时间。

以2016年(二)卷为例,我当时的统计结果大概是:

知识模块估计分值占比建议复习时间占比
C/C++基础与内存模型30%25%
操作系统与Linux25%25%
网络与分布式基础20%20%
数据结构与算法20%25%
其他(逻辑题、智力题等)5%5%

注意,算法复习时间占比我反而调高了5%,因为数据的结构虽然分值不是最高,但它是唯一一个“刷题效果立竿见影”的模块,多刷一道就多拿一道的分。而C/C++基础虽然分值高,但边际效益递减,吃透核心考点后再花大量时间死磕细节,性价比不高。

5.2 资料清单:不贪多,但每一本都要吃得透透的

市面上准备大厂笔试的资料实在太多,我的建议是精读三到四本,不要贪多嚼不烂:

  • 《深入理解计算机系统》(CS:APP):应对C/C++内存布局、指针、进程、虚拟内存等考点,是性价比最高的一本书。重点看第2、3、9章。
  • 《操作系统概念》(恐龙书)或国内教材的进程/线程、同步、死锁、内存管理章节:操作系统笔试的考点覆盖。
  • 《计算机网络:自顶向下方法》:重点看TCP、HTTP、DNS等应用层和传输层内容。
  • 《剑指Offer》+ LeetCode高频题清单:刷题的主力,重点练数组、链表、二叉树、动态规划和字符串题。

Linux命令不建议专门看书,直接在线上找一个命令速查手册,每天花20分钟过一遍常用参数,连续看一周就足够了。笔试考Linux通常不会太深,关键是“见过、有印象”。

5.3 复盘时最容易忽略的盲区:手写代码的规范度

最后一个想提醒的点,是笔试中手写代码(包括伪代码)的规范度。有不少人算法思路很清晰,但写出来的代码缩进混乱、变量命名随意、缺少注释,这在阅卷人眼里会大大扣分。

我的建议是备考时就养成习惯:

  1. 缩进统一,最好用4空格;
  2. 变量名要有意义,lenindexrootValue这类一眼能看懂;
  3. 核心逻辑旁边加一行注释,说明你“为什么这么做”;
  4. 写完代码后,用几秒钟过一遍边界条件,在注释里补充说明。

这样做短期内可能显得慢,但一旦形成习惯,笔试时你不会觉得是负担,反而能帮你理清思路,减少低级错误。说到底,笔试不只是给阅卷人看的,也是你自己思维过程的外化。写得规范,你的思路也会更清晰。

回到腾讯2016研发工程师笔试题(二)这份卷子,它虽然已经是很多年前的题了,但背后的考察逻辑放在今天依然成立:基础知识的深度理解、边界条件的敏感性、以及把理论转化为动手实践的能力。哪怕你不准备去大厂,按这个标准练习一遍,对自己的技术底子也是一次实打实的加固。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 14:58:56

架构设计技能实战指南:从领域建模到评审验收的完整流程

架构设计这件事&#xff0c;很多团队不是不会做&#xff0c;而是做得“不可见”&#xff1a;方案讨论完就散会&#xff0c;选型凭经验&#xff0c;评审走过场&#xff0c;等代码写出来才发现边界没划清。架构设计技能不是某一个开源工具&#xff0c;也不只是画几张架构图&#…

作者头像 李华
网站建设 2026/8/30 14:57:31

白嫖 github action + Gemini 自动化每日精选论文

0. 序 AI coding 现在越来越火热&#xff0c;不可避免有点焦虑。我也 vibe 了一个 Gemini 每日精选论文工具&#xff08;白嫖 github action 和 google AI studio 大模型 token&#xff09;&#xff0c;加紧学习效率。欢迎 star/fork 使用 1. 背景 随着 AI 技术的飞速发展&a…

作者头像 李华
网站建设 2026/8/30 14:53:35

HAMP-LIC解析:Hessian感知的混合精度量化助力图像压缩模型部署

做学习型图像压缩&#xff08;Learned Image Compression, LIC&#xff09;模型部署时&#xff0c;大家很容易被一个问题卡住&#xff1a;模型效果很好&#xff0c;但参数量大、计算量大&#xff0c;直接搬到移动端或边缘设备上跑不动。这里最常用的手段就是量化&#xff0c;但…

作者头像 李华
网站建设 2026/8/30 14:51:49

电子合格证解密Demo实战:Java AES/GCM加密文件解析与踩坑记录

简介&#xff1a;本资源是一款面向汽车制造企业、车辆认证机构及政府监管单位的机动车合格证解密与接口调用演示程序&#xff0c;聚焦合格证数据的安全解析、校验与系统集成场景&#xff0c;适用于具备C#开发基础的中高级技术人员。压缩包共50个文件&#xff0c;含16个核心DLL动…

作者头像 李华
网站建设 2026/8/30 14:49:53

网易研发工程师笔试题复盘:算法、操作系统与语言底层考点解析

2016年我在图书馆刷完网易研发工程师笔试题&#xff08;二&#xff09;那个晚上&#xff0c;印象最深的反而不是哪道题不会做&#xff0c;而是部分题目“明明知识点都见过&#xff0c;考场上一紧张就判断错了”。现在回头看&#xff0c;这套题的价值在于它把研发岗核心能力拆成…

作者头像 李华