
每年这个时间点总有学弟学妹来问我京东校招笔试到底考什么、难度怎么样。我翻出当年参加2019年京东校招C开发工程师笔试题的记录结合后来做面试官、帮人改简历的经验把整套题的考察逻辑和核心考点拆开讲一遍。这篇东西不是简单地报答案而是想告诉你京东这套笔试题背后到底在筛选什么样的人每个考点对应的知识盲区在哪里以及你现在刷题应该往哪个方向使劲。如果你正在准备大厂C开发岗的校招或者刚接触校招笔试想摸清套路这篇文章可以当一份“备考地图”用。我会把当年笔试里多次出现的C/C语言基础、数据结构与算法、操作系统、网络基础四块内容逐一拆解每道典型题都讲清楚出题意图、完整解法、常见失分点最后再聊聊笔试现场的时间分配和心态调整。内容偏实战代码可以直接拿去跑。1. 2019年京东校招C笔试题整体风格与考察范围1.1 笔试环节的定位与淘汰逻辑大厂校招的笔试环节本质上不是用来“选拔天才”的而是用来“快速过滤不合格者”的。2019年京东C开发工程师的笔试整体难度在当年的大厂校招里属于中上水平题量不算特别大但覆盖面很广。我记得当时的选择题大概有20道左右覆盖了语言细节、数据结构、操作系统、网络协议四个方向后面跟着两道到三道编程题需要在限定时间内完成编译提交。很多人以为笔试只是走个形式真正重要的是面试。这个想法很危险。京东的简历筛选通过率本身就不高笔试环节又会卡掉一批人如果你连笔试都过不了后续的面试机会根本拿不到。从出题风格来看这套笔试题明显不是随便从题库里抓题拼凑的它有一套很清晰的筛选逻辑先看你的语言基本功扎不扎实再看你写代码的思路清不清晰最后看你在压力下能不能把题目做对。1.2 考察范围四块核心内容结合我自己的考试记录和后来接触到的题目回忆2019年京东校招C笔试题库的考察范围基本稳定在以下四个方向C/C语言基础包括指针、引用、内存管理、const/static关键字、虚函数与多态、构造函数与析构函数、STL容器的底层原理等。这部分占比最大也是很多人的失分重灾区。数据结构与算法包括链表操作、字符串处理、排序算法、二叉树遍历、图的最短路径等。编程大题主要从这里出选择题也会穿插一些复杂度分析。操作系统进程与线程、死锁、内存管理方式分页、分段、进程间通信、用户态与内核态切换等。考察深度不深但概念必须清楚。计算机网络TCP/UDP协议、三次握手与四次挥手、HTTP协议状态码、IP地址分类、滑动窗口机制等。这部分是必考项每年都会出现。1.3 题型分布与分值特点从题型分布来看选择题占了大概60%的分数编程题占了40%。选择题全部是客观题但千万不要小看它们。京东的选择题有个特点它很少直接考“xx的定义是什么”这种背诵型题目而是喜欢把一个知识点包装成一段代码或者一个实际场景让你判断输出结果或者分析哪个说法正确。比如给你一段涉及指针运算的代码问你最终输出的值是什么或者给你一个关于死锁的描述问你哪个选项不是死锁产生的必要条件。编程题则是典型的“算法题”风格要求你实现一个完整功能并且对时间复杂度和空间复杂度有一定要求。当年我印象最深的一道题跟字符串处理有关核心考点其实是双指针技巧和边界处理能力。后面我会详细展开这类题目的解题套路。2. C/C语言基础题最容易被拉开差距的部分2.1 指针与引用的区别选择题高频考点不管哪一年的京东校招指针和引用的区别几乎都是必考题。这个知识点看似简单但出题人特别喜欢用代码片段来“钓鱼”。我当时遇到的一道题大概是这样的#include iostream using namespace std; void func(int* p) { int a 100; p a; } void func2(int r) { int b 200; r b; } int main() { int x 10; int* p x; func(p); cout *p endl; int y 10; func2(y); cout y endl; return 0; }问你最终输出的两个值是什么。大部分人第一个空会填100第二个空会填10结果刚好反了。这里就要把指针和引用的本质区别理清楚指针是一个变量它存储的是另一个变量的地址。在func中p作为指针参数传递时传递的是指针的值拷贝也就是说func内部的p和外部的p是两个不同的变量只是它们一开始存了相同的地址。当我们在func内部写p a时只是让func内部的p指向了a外部p的指向完全没有变。所以外部p仍然指向x输出就是10。而引用在语义上是变量的别名函数传引用时不会产生副本。func2中的r就是外部变量y的别名对r赋值等于直接修改y所以输出是200。注意很多人把“指针传递”误以为“引用传递”这是大厂笔试中非常经典的失分点。记住一句话指针传递是值传递只是传递的值是地址引用传递才是真正的别名传递。2.2 内存管理malloc/free与new/delete的区别内存管理几乎是每套C笔试题的“保留节目”。京东2019年的题目里有一道多选题考察malloc/free与new/delete的区别。这个知识点的核心差异可以整理成一张表对比项malloc/freenew/delete本质C标准库函数C运算符/关键字是否调用构造函数不调用new会调用构造函数delete会调用析构函数返回值void*需要类型转换返回具体类型的指针分配失败时返回NULL抛出bad_alloc异常能否重载不能以函数形式重载可以在类内部重载数组支持malloc(100 * sizeof(int))new int[100]delete[] arr出题人如果只考区别本身那太简单了。真正容易出错的是使用层面的陷阱。比如new[]和delete不匹配使用如果你用new int[10]分配了数组却用delete而不是delete[]释放在C标准下这是未定义行为。很多编译器可能“看起来没问题”但在复杂类对象的数组上delete会导致前面N-1个对象的析构函数不被调用从而造成资源泄漏。这种bug在笔试的小程序里也许测不出来但在实际项目里非常致命。再比如malloc失败返回NULL但new失败是抛异常。我在笔试时遇到过一个场景题有一段代码用malloc分配了一块内存然后直接对指针进行赋值操作问你会出现什么问题。出题人想考察的是你没有判断malloc返回值是否为NULL就使用了指针一旦分配失败就会解引用空指针程序直接崩溃。这是C语言里安全编码的红线到了C里即使有了new很多老代码还是在用malloc这个判断习惯必须养成。2.3 关键字const与static的深挖const和static这两个关键字属于“看着简单实际门道很多”的考点。2019年京东笔试里有一道题专门考察const在C和C中的区别。在C语言中const int n 10; 这里的n本质是一个只读变量它仍然是一个全局变量或栈变量不能用作数组长度但在C中const int n 10如果是在编译期就能确定的“常量表达式”它是可以作为数组大小的这就是C和C在const语义上的微妙差异。const更经典的考法是“指向常量的指针”和“常量指针”的区别const int* p1; // 指向const int的指针p1本身可变但*p1不可变 int* const p2; // 指向int的常量指针p2本身不可变但*p2可变 const int* const p3; // 指向const int的常量指针两者都不可变你判断一个const修饰的是谁核心方法是看const修饰符离谁最近或者看它是在的左边还是右边。const在左侧修饰的是指针指向的对象const在*右侧修饰的是指针本身。static关键字考察的角度更多。static修饰局部变量时变量存储在静态存储区生命周期延长到程序结束并且只在首次执行到声明语句时初始化一次。static修饰全局变量和函数时限制了它们的作用域只在当前文件内防止外部文件通过extern访问。static修饰类成员变量时所有对象共享同一个副本必须在类外单独定义和初始化static修饰类成员函数时该函数没有this指针只能访问类的静态成员。出题人喜欢把static和C的对象模型结合起来考。比如问你静态成员变量可以声明为const吗可以。如果const static整数型成员变量在C11之前还可以直接在类内初始化但非整型的静态常量成员必须在类外定义。这类细节如果你没有亲手写代码踩过坑选择题里很容易选错。2.4 虚函数与多态的实现原理虚函数是C笔试里不可能回避的考点因为它是面向对象三大特征之一“多态”的实现基础。京东2019年考了一道关于虚函数表vtable的选择题。题目大意是有一个基类Base定义了一个虚函数virtual void show()然后派生类Derived继承了Base并重写了show。当你通过基类指针调用show时会发生什么答案的核心每个含有虚函数的类在编译时会生成一张虚函数表vtable表中存放着该类所有虚函数的地址。每个对象内部有一个隐藏的指针vptr指向它所属类的虚函数表。当通过Base*指针调用虚函数时程序不是编译时硬编码调用地址而是运行时通过对象的vptr找到vtable再根据索引找到真正应该调用的函数地址。因为派生类重写了showDerived对象的vtable里show的地址指向Derived::show所以通过基类指针调用时会执行派生类的版本——这就是动态绑定。这里最常考的深入问题是构造函数和析构函数能不能是虚函数构造函数不能声明为虚函数。因为虚函数的调用依赖于vptr而vptr的初始化是在构造函数中完成的。如果基类的构造函数还没有执行对象的vptr尚未指向正确的虚函数表调用虚函数就没有着落。析构函数最好声明为虚函数。如果你有一个基类指针指向派生类对象用delete这个基类指针时如果析构函数不是虚函数就只会调用基类的析构函数派生类的析构函数不会被调用从而造成资源泄漏。这就是著名的“用基类指针删除派生类对象要有虚析构”原则。我还见面试题里考过一道延伸题在构造函数中调用虚函数会发生什么答案是不会触发动态绑定而是调用当前类自己的版本。原因是C标准规定在构造或析构函数内部即使发生了虚函数调用也只会在当前正在构造或析构的类所对应的层级执行。理解了vptr在构造过程中的创建顺序这个结论就能顺理成章地推导出来。3. 数据结构与算法题笔试中的重头戏3.1 字符串操作字符串逆序的多种写法字符串逆序是我见到出现频率最高的编程题之一2019年京东的笔试题里也有涉及。它看起来简单但可以考察很多细节。基础版题目是这样的输入一个字符串将其逆序输出要求不使用额外的数组就地逆序。最直接的写法是用两个指针一个指向字符串开头一个指向结尾交换指针指向的字符然后两个指针向中间移动#include stdio.h #include string.h void reverse(char* str) { if (str NULL) return; int left 0; int right strlen(str) - 1; while (left right) { char tmp str[left]; str[left] str[right]; str[right] tmp; left; right--; } } int main() { char str[] hello world; reverse(str); printf(%s\n, str); return 0; }这个解法的时间复杂度是O(n)空间复杂度是O(1)。但笔试考法往往是升级版。比如只反转每个单词内部的字符而单词的顺序不变或者反转整个句子同时每个单词内部字符也反转。这两道题恰好对应两道经典LeetCode原题但笔试时你不会意识到它们就是LettCode原题因为这些题会伪装成一段业务场景描述。升级版题目要求给定一个字符串反转整个字符串中单词的顺序但单词内部的字符顺序保持不变。比如输入“i am a student”输出“student a am i”。解题思路是先反转整个字符串得到“tneduts a ma i”然后再逐个单词反转回来。两次反转每个字符被处理两次时间复杂度还是O(n)。这里我特别想强调字符串题目最容易翻车的不是算法本身而是对C风格字符串和C string类的使用边界搞不清楚。在C里字符串以\0结尾strlen不包含结尾的\0如果你用sizeof代替strlen来计算字符串长度就会出错。在C里使用std::string会更安全可以直接用std::reverse算法或者双指针不用考虑\0的问题。笔试时如果允许优先用std::string减少出错概率。3.2 排序算法冒泡排序及其优化排序算法是笔试选择题和编程题的基础。京东2019年的笔试里出现过关于排序稳定性和时间复杂度的选择题比如问快速排序和归并排序哪个是稳定的以及堆排序建堆过程的时间复杂度。冒泡排序虽然效率不高但在笔试中经常以“让你优化”的形式出现。经典版冒泡排序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; } } } }优化点有两个。第一个优化设置一个标志位如果某一轮遍历过程中没有发生任何交换说明序列已经有序直接退出。这在处理近乎有序的数据时可以把时间复杂度从O(n^2)降到O(n)。第二个优化记录每一轮最后发生交换的位置这个位置之后的元素已经是排好序的下一轮只需要遍历到这里缩小比较范围。要知道为什么校招笔试题喜欢考冒泡排序因为它能在最短时间内考察一个候选人写代码的基本功循环边界条件有没有处理干净、是否有越界风险、有没有做优化。真的不是因为它有多难而是因为它在“是否值得信任”这个维度上能提供很强的信号。不过我更推荐你在备考时把重点放在快速排序和归并排序上。京东2019年的编程大题里虽然没有直接让你写快速排序但很多题目的最优解的思路都用到了“分区”和“二分”的思想。快排的partition操作本身就是一个极高频的代码片段不止排序在用查找第K大的元素、荷兰国旗问题、数组按某个值分成前后两段都可以用同一个模板。3.3 链表操作题反转链表与环检测链表题属于校招笔试的高频编程题也是C指针操作的“炼金石”。2019年京东笔试的编程题中链表相关出现了不止一次。最经典的是反转链表。给定一个单链表的头节点head将链表反转返回新链表的头节点。迭代法实现struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* reverseList(ListNode* head) { ListNode* prev NULL; ListNode* curr head; while (curr ! NULL) { ListNode* nextTmp curr-next; curr-next prev; prev curr; curr nextTmp; } return prev; }这个代码的难点不在于理解“把指针方向反过来”而在于在改变一个节点的next之前必须先保存它的next节点否则链表就断了。很多第一次写链表反转的人都会在这里卡住。笔试时如果你理解了“暂存后继节点”这个核心步骤反转链表就顺了。另一个高频链表题是判断链表中是否有环。最常见的解法是快慢指针快指针每次走两步慢指针每次走一步如果存在环快慢指针一定会在某个节点相遇。这个算法的正确性可以这样理解如果链表中存在环当慢指针进入环后快指针已经在环内两者都在环内移动且快指针比慢指针快一步相当于快指针在追赶慢指针最终一定能追上。快慢指针还有个经典应用找链表的中间节点。慢指针走一步快指针走两步快指针到链表末尾时慢指针刚好在中间。链表题在笔试中真正考察的能力是“指针边界处理”。比如反转链表时输入是空链表怎么办只有一个节点怎么办链表长度为偶数时中间节点是哪一个这些边界条件如果没有在写代码时明确考虑测试用例只要有一组没通过这道题就可能得不了满分。3.4 图论基础迪杰斯特拉最短路径图论在京东的笔试题中不算最常考但迪杰斯特拉算法因为是一道经典算法偶尔会出现在选择题或者编程题的背景里。相关的热搜词里也有“迪杰斯特拉c”说明这个考点确实是很多人搜索过的重点。迪杰斯特拉Dijkstra算法的核心思想是贪心每次从未确定最短路径的顶点中选择一个距离起点最近的顶点然后更新它所有邻接顶点的距离。这个算法要求图中不能有负权边。我提供一个适合笔试记忆的C实现版本基于邻接矩阵遍历#include vector #include algorithm using namespace std; const int INF 0x3f3f3f3f; vectorint dijkstra(int n, int start, const vectorvectorint graph) { vectorint dist(n, INF); vectorbool visited(n, false); dist[start] 0; for (int i 0; i n; i) { int u -1; for (int j 0; j n; j) { if (!visited[j] (u -1 || dist[j] dist[u])) { u j; } } if (dist[u] INF) break; visited[u] true; for (int v 0; v n; v) { if (!visited[v] graph[u][v] ! INF) { dist[v] min(dist[v], dist[u] graph[u][v]); } } } return dist; }笔试时如果你想不起来堆优化的版本用邻接矩阵版本也足够通过大部分题目但要注意它的时间复杂度是O(n^2)。如果题目明确说明图是稀疏图且节点数量很大比如上万O(n^2)会超时此时需要用优先队列实现堆优化版本。实际备考建议图论算法不需要背很多把Dijkstra、Floyd、图的深度优先遍历和广度优先遍历这四种搞清楚就够了。京东这类公司笔试题更加关注的是你能否快速识别出“这道题是图论题”而不是“这道题是不是Dijkstra原题”。4. 操作系统与网络基础题考察面广但不深4.1 进程与线程的区别2019年京东笔试的这部分题目延续了大厂校招对计算机基础知识的重视。进程与线程的区别是操作系统模块的必考选择题。标准回答是进程是操作系统进行资源分配的基本单位拥有独立的地址空间线程是CPU调度的基本单位是进程中的一个执行流多个线程共享所属进程的地址空间和资源。因此线程创建和切换的开销比进程小但线程之间需要额外的同步机制来保证数据安全。备考时要特别注意一个容易混淆的点为什么线程切换比进程切换开销小因为进程切换需要切换页表、刷新TLB、切换地址空间而同一进程内的线程切换不涉及地址空间切换只需要保存和恢复寄存器状态、程序计数器等少量上下文。但这里有个陷阱线程切换仍然涉及用户态与内核态的切换因为线程调度是由操作系统内核完成的。如果你回答“线程切换不需要陷入内核态”那就错了。操作系统部分还常考死锁。死锁产生的四个必要条件是互斥条件、持有并等待条件、不可剥夺条件、循环等待条件。这四个条件必须同时满足才会产生死锁。预防死锁的思路就是破坏这四个条件中的任意一个。比如通过资源有序分配法破坏循环等待通过一次性申请所有资源破坏持有并等待。选择题里经常给出一个具体场景问你它破坏了哪个条件这种题需要你对四个条件有深刻理解。4.2 TCP三次握手与四次挥手网络基础部分TCP的建立连接和断开连接过程是京东笔试的“钉子户”。一道典型的考题是在TCP三次握手过程中客户端和服务器分别经历了什么状态变化三次握手的过程可以用一个表格归类步骤发送方接收方报文类型状态变化第一次客户端服务器SYN1, seqx客户端进入SYN_SENT状态第二次服务器客户端SYN1, ACK1, seqy, ackx1服务器进入SYN_RCVD状态第三次客户端服务器ACK1, seqx1, acky1客户端进入ESTABLISHED状态四次挥手的过程类似主动关闭方发送FIN对端回复ACK随后对端也发送FIN主动关闭方回复ACK。这里常考的问题有两个为什么建立连接是三次握手而断开连接是四次挥手答案是因为TCP是全双工的建立连接时SYN和ACK可以在第二次握手中合并成一个报文而断开连接时对端可能还有数据要发送不能把FIN和ACK合并所以多了一次交互。另一个问题是TIME_WAIT状态的作用保证最后一个ACK能够到达对端以及让旧连接的重复数据包在网络中自然消失。4.3 TCP与UDP的区别及典型应用TCP与UDP的区别也是每年的必考内容。TCP是面向连接的、可靠的、基于字节流的传输层协议提供确认重传、排序、流量控制、拥塞控制等机制UDP是面向无连接的、不可靠的、基于数据报的传输层协议发送数据前不需要建立连接不保证可靠性。选择场景题经常这样考以下哪种应用适合使用UDP协议DNS查询、视频直播、语音通话这些对实时性要求高但不要求绝对可靠的应用通常用UDP而HTTP、FTP、SMTP等要求数据完整可靠的应用用TCP。这里我要纠正一个误区UDP并不是“不如”TCP而是“不同”。视频通话如果用TCP一旦发生丢包TCP的重传机制会导致延迟越来越大体验反而更差。UDP配合上层应用自己实现纠错或丢包策略反而更适合实时通信场景。这个点如果笔试以简答题形式出现你能把这个逻辑说出来就很加分。5. 编程大题实战从读题到AC的完整思路5.1 校招笔试编程题的常见套路京东2019年C开发的编程大题基本延续了大厂校招的经典风格题目用一段话描述一个实际问题要求你实现一个函数或完整的程序输入输出格式在题目中明确说明。去面试现场和在线笔试系统的区别在于在线笔试系统往往要求候选人处理标准输入输出stdin/stdout而不是像LeetCode那样只填充函数。这点非常重要。很多平时只在LeetCode刷题的同学到了正规的在线笔试平台连如何读入一行包含多个整数的输入都会卡住。我当时参加笔试时有一条不成文的经验先写一个本地测试用的main函数框架包含cin/cout或scanf/printf的完整输入输出流程确认能跑通再填充核心逻辑代码。常见的输入处理方式#include iostream #include string #include sstream #include vector using namespace std; int main() { string line; vectorint nums; getline(cin, line); stringstream ss(line); int num; while (ss num) { nums.push_back(num); } // 此时nums里存了一行所有整数 return 0; }第一种容易踩坑的地方是如果你用cin n读取第一个整数然后用getline(cin, line)读取下一行字符串中间往往会读到一个残留的换行符导致line为空。这个细节在笔试调试时特别容易让人抓狂。建议的做法是统一用getline读取一整行再用stringstream拆分避免cin和getline混用。5.2 一道典型题的完整实现我根据2019年京东C开发笔试题的常见风格整理了一道综合题。题目如下给定一个字符串你需要实现以下操作将字符串中的每个单词内部字符逆序同时保持单词之间的相对顺序不变。单词之间以一个或多个空格分隔。输出处理后的字符串。输入示例hello world 输出示例olleh dlrow这道题看上去简单但实际写起来容易在“多个空格分隔”这个条件下翻船。如果用C的std::string和stringstream单词之间的多个空格会被自动忽略如果题目要求保留空格数量不变就不能用stringstream。保留空格的写法是这样#include iostream #include string using namespace std; string reverseWord(const string s, int left, int right) { string res s; while (left right) { swap(res[left], res[right]); left; right--; } return res; } string reverseWords(string s) { int n s.size(); int i 0; while (i n) { while (i n s[i] ) i; int start i; while (i n s[i] ! ) i; int end i - 1; if (start end) { s reverseWord(s, start, end); } } return s; } int main() { string s; getline(cin, s); cout reverseWords(s) endl; return 0; }核心思路就是双循环外层循环跳过空格内层循环找到一个单词的左右边界然后对左右边界内的字符进行逆序。时间复杂度O(n)空间复杂度O(1)不考虑函数传参时的拷贝。这类题笔试时真正的失分点在于忘记处理字符串为空、全是空格、只有一个单词、单词之间有多个空格等边界情况。做题时建议在草稿纸上先把输入的特殊情况列出来再动手写代码。我当年做这题时就因为没有保留原始空格个数差点没通过全部测试用例。5.3 时间复杂度的控制技巧编程大题通常会给出数据范围比如“字符串长度不超过10^6”。这意味着你必须设计一个O(n)的解法不能出现O(n^2)的操作。像字符串拼接时频繁使用号、在循环内调用substr都容易把复杂度拉到O(n^2)。高频优化技巧包括使用双指针代替频繁构造新字符串。使用std::reverse或者手写逆序时注意只遍历半个数组。如果涉及统计频次优先用数组而不是unordered_map因为数组的常数更小。对链表和树进行操作时优先考虑递归和迭代哪个更不容易爆栈。关于递归可能会导致栈溢出京东的笔试平台我印象中是对递归深度有限制的。如果你用递归去遍历深度达到10^5级别的树或者链表很大概率直接栈溢出。遇到这种题尽量用迭代配合显式栈来实现。6. 笔试现场经验与避坑指南6.1 做题顺序与时间分配2019年京东C开发笔试的总时长我记得是90到120分钟选择题和编程题混合在一起。建议做题顺序是先花5分钟快速浏览所有题目大致了解编程题的难度然后先把会做的选择题做完把不会的题目标记出来最后集中时间做编程题。选择题不要恋战。遇到一道题思考超过两分钟还没头绪先随便选一个标记下来后面有时间再回头想。编程题优先做自己最有把握的那道题不要死磕难题。一个非常现实的原因在线笔试的判定是按通过的测试用例数量给分的你写出一个只能通过部分用例的版本也比你最后交白卷强得多。很多同学总觉得“我要写就要写最优解”结果一道题磨了四十分钟还没写全另外两道简单的题反而没时间做。6.2 选择题的排除技巧京东的选择题是多选题和单选题混合的多选题容易漏选或错选。遇到不确定的选项用“矛盾排除法”很有效。比如题目问“以下哪些操作可能导致内存泄漏”选项里有“delete一个非动态分配的对象”和“new一个对象后忘记delete”。前者其实是未定义行为不一定是内存泄漏后者是典型的泄漏场景。如果你不确定“delete非动态分配对象”算不算泄漏可以反过来想new的对象如果没释放内存肯定泄漏了而delete非动态分配对象属于程序逻辑错误不是这个问题的标准答案。另外要注意选项之间是否存在互斥关系。如果两个选项表达的意思完全相反通常只有一个是正确的如果题目是单选题而两个选项都在字面上看起来正确那就要重新读题看看是不是有什么隐藏条件。6.3 编程题常见输入输出细节我见过太多同学在笔试结束时捶胸顿足原因不是不会做而是栽在输入输出格式上。以下是几个必须记住的细节如果题目要求处理多组输入直到EOF用while (cin x)的写法不要用for循环写死。输出格式要求末尾不能多一个空格时可以用flag控制第一个元素前不要空格从第二个元素开始先输出一个空格再输出元素。如果你使用printf输出double类型注意格式控制是%lf还是%f在C里printf对float和double的处理方式不同。在线笔试平台的编译器版本通常是C14或C17但不要依赖最新的C20特性也不要使用非标准的头文件比如bits/stdc.h虽然有部分平台支持但遇到不支持的编译器就麻烦了。另外一个容易被忽视的点在笔试平台中代码的提示和编译器输出可能不会完全显示如果你遇到编译错误第一反应应该是检查是不是漏了分号、括号不匹配或者头文件拼写错误而不是重新设计算法。很多编译错误其实就是“多擦了一个字母”这种低级失误。6.4 心态调整笔试没那么可怕回到开头那个问题京东2019校招C开发工程师的笔试到底难不难我的判断是真正难的不是题目本身而是你在有限时间内面对不熟悉的知识点时的慌乱。从通过率来看笔试确实会淘汰不少人但因为题目难度本身并没有超纲只要认真准备通过是大概率事件。我当时准备校招时有一个习惯每次笔试完不管过没过都会把考的题目在当天复盘一遍把不会的知识点写在笔记里然后第二天早上重新看一遍。这个过程积累下来到了真正面试的时候很多基础问题我不用思考就能答上来因为每做一套笔试题就等于把基础知识又过了一遍。如果你现在正在准备京东或者其他大厂的C开发岗校招不用焦虑。把语言基础、数据结构、操作系统、网络协议这四块内容按部就班过一遍再把常见编程题的套路练熟最后做题时把边界条件处理好你距离通过笔试其实已经非常近了。