news 2026/9/8 23:12:23

爱奇艺C/C++校招笔试全解析:从指针内存到LRU缓存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
爱奇艺C/C++校招笔试全解析:从指针内存到LRU缓存

刚把爱奇艺2020校招C方向的第二场笔试题完整刷了一遍,考点和解法花了一整个周末整理成笔记。这篇不搞标准答案式的流水账,按我实际做题的顺序来写,说清楚每一类题到底在考什么、为什么这么考,以及考场上让你少丢分的关键细节。

爱奇艺这种视频类互联网公司的C/C++岗位,笔试风格和纯互联网工具类公司不太一样。业务涉及视频编解码、播放器、CDN调度、推荐系统、大数据处理,所以对候选人的底层功底和并发处理能力要求很扎实。选择题覆盖面广,编程题偏向工程性的场景题。准备投爱奇艺,或者想拿它当C/C++校招笔试练兵场的,这篇都值得花十分钟细看。我把题目构成拆开,再把高频考点逐条展开,最后放两道编程题的完整实现过程。

1. 题目整体构成与出题思路分析

1.1 为什么爱奇艺的C方向笔试这么考

看完整套题,最直观的感受是:这是一份“给真正写过代码的人”准备的卷子,不是背书就能过的。选择题里大量考察C语言的内存模型、指针运算、结构体对齐这类底层细节,编程题则集中在链表操作、字符串处理、缓存设计、线程安全这些工程里天天会碰的东西。

爱奇艺的C/C++岗位主要面向播放器内核、后端服务、CDN节点、音视频处理等方向,这类岗位的共同特点是:对性能敏感、对稳定性要求高、对并发场景处理能力要求强。所以笔试不会去考那种“八股文式”的背诵题,而是会把语言特性、操作系统原理、数据结构揉在一起,用一套综合题筛选出基础扎实的人。

另外有一个细节值得注意:整套题的选择题部分,错误选项设置得很“真实”。不是那种一眼就能排除的错误,而是把容易混淆的写法都混进去。比如指针和数组的关系、strcpy和memcpy的区别、malloc和calloc的差异,这些如果平时只是“看过”而没有自己上手写过,很容易在这类选项上翻车。

1.2 整套试卷的知识点分布

从题目覆盖范围来看,爱奇艺这套C方向笔试题大致可以分成四个模块:

  • C语言基础与内存管理:指针、数组、字符串函数、结构体对齐、malloc/free、内存泄漏
  • 数据结构与算法:链表、哈希表、栈与队列、排序、动态规划、双指针
  • 操作系统与网络:进程线程区别、锁、死锁、堆栈区别、TCP连接状态、select/epoll
  • Linux与工程实践:常用命令、gdb调试、编译链接过程、多文件工程组织

四个模块不是一个平均分配的状态。从我做题的感受和后来对照的面经来看,C语言基础部分占比最高,大概四成以上;数据结构与算法其次,三成左右;操作系统和网络再占两成;Linux和工程实践占剩下的一成。这个比例和很多视频类互联网公司的校招题目分布基本一致,核心逻辑是:先确认你的语言基本功够不够扎实,再确认你能不能把数据结构和算法用于解决真实问题,最后确认你有没有基本的工程素养。

2. C语言基础题:真正的送分题里藏着坑

2.1 指针和数组:最容易被绕进去的考点

指针和数组的关系,几乎每次C方向笔试都会出现,爱奇艺这套也不例外。它不会直接问你“指针是什么”,而是给一段代码让你判断输出结果。比如:

#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; int *p = a; printf("%d %d %d\n", sizeof(a), sizeof(p), *(p + 3)); return 0; }

这道题最关键的点在于:sizeof(a)sizeof(p)的结果完全不同。a是数组名,在sizeof运算符里代表整个数组,所以结果是5 * sizeof(int);而p是指针,在64位系统下固定是8字节,不管你指向的是什么类型。这里如果对“数组名在什么场合退化为首元素地址”这个规则不熟,很容易把两个结果都答成一样的。

更狠的考法是把二维数组和指针结合起来:

int a[3][4] = {0}; int *p = &a[0][0];

然后问你*(p + 5)是多少、a[1]*(a + 1)是否等价这类问题。这背后考的是C语言里“多维数组本质上是数组的数组”这一特性,以及指针算术运算的步长规则。记住一个关键点:a + 1移动的是一个“包含4个int的一维数组”的长度,而p + 1移动的是一个int的长度。这俩如果搞混,题就没法做了。

再补充一个我当年踩过的坑:用int **pp = &a;这种写法去指向二维数组。编译阶段可能只是警告,但运行起来访问就会出错,因为&a的类型是int (*)[3][4],和int **是完全不一样的东西。笔试中如果遇到这种选项,直接判定为错误即可。

2.2 字符串处理:最容易丢分的细节都在这里

C语言字符串的题,表面上考的是库函数,实际上考的是对“以\0结尾的字符数组”这个底层事实的理解。爱奇艺这套题里,字符串相关的选择题至少有三四道,而且每道都跟内存操作有关。

第一类常考的是strcpystrncpymemcpymemmove的区别。比如给出这么一段代码:

char src[] = "hello"; char dst[10]; strcpy(dst, src);

问你这样写有没有问题。如果函数原型是strcpy(char *dest, const char *src),那么上面这个调用其实是可以正常工作的,因为数组名会退化为指针传入。但如果把dst声明为char *dst;而没有分配空间,再执行strcpy,那就是典型的缓冲区未初始化错误,运行时会崩溃。

第二类常考的是字符串逆序。这个考点在热词里反复出现,说明确实是笔试高频题。实现字符串逆序的核心思路是双指针:一个指向字符串头,一个指向字符串尾,交换字符并向中间移动。需要注意的点是:不能直接用strlen之后往原字符串尾部写,因为字符串常量区的内容是不可修改的,必须先复制到可写缓冲区再操作。

第三类容易丢分的是中文编码相关的问题,比如在UTF-8编码下用strlen统计中文字符串长度,得到的结果和字符数完全不同。这类题在普通公司笔试里不一定出现,但爱奇艺这类有内容业务的公司的题库里反而会有,因为实际工程里文本处理是常态。

2.3 内存管理:堆、栈与内存泄漏的判断

C语言的内存管理是笔试的必考区域,也是面试官判断候选人是否真正写过C/C++的重要指标。这套卷子在这一块出了好几道题,覆盖面从堆栈区别到野指针到内存泄漏。

堆和栈的区别是最基础的一题:栈由编译器自动分配和释放,存放局部变量和函数调用信息,分配速度快但空间有限;堆由程序员手动分配和释放,空间大但分配速度慢,且必须配对使用mallocfree。如果把一个局部变量的地址返回给调用方,调用方再通过这个地址去访问数据,就是典型的悬垂指针错误,因为函数返回后栈空间已经被回收。

另一种高频题是判断一段代码有没有内存泄漏:

void func() { char *p = (char *)malloc(100); if (some_condition) { return; } free(p); }

some_condition为真时,函数提前返回,p指向的内存没被释放,这就产生了内存泄漏。笔试中判断内存泄漏的核心思路就是:检查每一条return路径上是否都执行了对应的释放操作。这个考点也可以反过来考:释放了两次同一块内存怎么办,答案是double free,属于未定义行为,可能直接导致程序崩溃,也可能让堆管理器出错。

2.4 结构体对齐:看着简单,一算就错

结构体对齐的题我每次做都会提醒自己:不要想当然。这套笔试题里有一道典型的结构体大小计算题:

struct test { char a; int b; char c; };

在默认对齐规则下,sizeof(struct test)是多少?很多人会直接算成1 + 4 + 1 = 6,但实际上在32位和64位系统下通常都是12。原因是编译器会把b放在4字节对齐的地址上,a后面会填充3个字节,c后面再填充3个字节,最终整个结构体大小是成员中最大对齐数的整数倍(这里是4的倍数)。

如果我把成员顺序调整一下:

struct test { char a; char c; int b; };

结果就变成8了,因为ac连续存放在一起,b只需要对齐到偏移4的位置即可。这个知识点在笔试里考察的不仅是计算能力,更是在考察你是否理解“性能换空间”和“空间换性能”的取舍。实际工程中,如果你要写一个需要大量传输或者存储的结构体,成员的排列顺序直接影响内存占用和带宽消耗。

我还遇到过一道更进阶的题,是关于位域的对齐,以及#pragma pack指令的使用。#pragma pack(1)可以强制结构体按1字节对齐,这样结构体的大小就完全等于成员大小的和,适合在读写二进制文件或网络协议时使用。但它会导致非对齐访问,在某些平台上性能下降甚至触发异常,笔试里如果问到这个,答案是“按需使用,不能无脑压缩对齐”。

3. 数据结构与算法题:笔试的区分度所在

3.1 链表操作题:反复出现的“老朋友”

爱奇艺这套笔试题里,链表相关的题目出现了好几次,这是C方向笔试的特色。因为链表天然适合考察指针操作和理解,而指针操作又是C语言的核心能力。题目类型集中在三块:链表反转、链表去重、双链表插入删除。

链表反转是最高频的题目,没有之一。迭代法实现的核心代码很简洁:

struct node *reverse(struct node *head) { struct node *prev = NULL; struct node *curr = head; while (curr) { struct node *next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; }

这段代码的易错点在于:在修改curr->next之前,必须先把原来的next保存下来,否则原链表就断了。笔试中经常会在这一步埋坑,比如让你判断一段已经写好的反转代码哪里有bug,很多人的注意力都在循环条件上,反而忽略了这最关键的一步。

链表去重考察的是对“节点删除”操作的理解:删除节点时,前驱节点的next必须指向被删除节点的后继。这里有一个链表题通用的解题技巧:引入一个dummy哨兵节点作为新的链表头,可以避免处理“头节点本身就是重复节点”这种特殊判断。这个技巧在笔试和面试中都非常实用,值得反复练习,直到形成肌肉记忆。

爱奇艺的链表题还有一个特点:喜欢把链表和哈希表结合考。比如“删除链表中的重复元素,要求时间复杂度O(n)”,最优解就是用一个哈希表保存已经出现的值,遇到重复节点直接删除。这比嵌套循环的O(n^2)解法优秀得多,也体现了候选人是否有复杂度意识。

3.2 哈希表与缓存设计:贴近业务场景的考题

视频网站的业务场景里,缓存无处不在:用户信息缓存、播放进度缓存、推荐结果缓存。所以爱奇艺笔试里出现缓存设计相关的题目,完全在意料之中。其中最有代表性的就是手写LRU缓存。

LRU(Least Recently Used,最近最少使用)算法的核心思想是:当缓存满时,优先淘汰最久没有被访问的数据。实现上需要两个数据结构配合:哈希表负责O(1)查找,双向链表负责O(1)删除和移动。哈希表的key对应缓存项的键,value指向双向链表中的节点;每次访问某个key时,就把对应节点移动到链表头部;当缓存满了需要淘汰时,删除链表尾部的节点,并同步删除哈希表中的记录。

这道题在笔试中考察的不仅是数据结构知识,还有你对“组合数据结构”的理解能力。单一哈希表可以做到O(1)查找但不能维护访问顺序,单一链表可以维护顺序但查找是O(n),只有两者结合才能同时满足要求。这种思路正是工程中解决性能问题的常见方式,也是面试官希望看到的思维模式。

3.3 动态规划与贪心:绕不开的经典模型

爱奇艺笔试题里的动态规划题目难度适中,但很有代表性。其中一道比较典型的是“最长回文子串”的变体,考察的虽然是经典问题,但对状态定义和递推关系的理解要求很高。

定义状态dp[i][j]表示子串s[i]s[j]是否为回文串。状态转移方程是:当s[i] == s[j]dp[i+1][j-1]为真时,dp[i][j]为真。需要注意的边界条件是:长度为1的子串一定是回文,长度为2的子串只需要判断两个字符是否相等。实现时要从长度短的子串开始遍历,而不是从i从小到大遍历,因为dp[i][j]依赖的是更短的子串状态。

贪心算法那边,常考的是区间调度问题:给定一系列区间,求最多能选多少个互不重叠的区间。经典解法是按照区间的结束时间排序,然后依次选择结束时间早且与当前已选区间不重叠的区间。这背后其实有一个很关键的反证法逻辑:为什么选择结束时间早的更优?因为结束时间早,留给后面区间的空间就更大。笔试中不仅考察你能不能写出代码,更考察你能不能说出这个选择策略为什么是对的。

4. 操作系统、网络与Linux:从语言到工程的一道坎

4.1 进程、线程与并发控制

视频服务的特点是并发量极高,所以爱奇艺笔试里操作系统相关的题目,重点落在并发控制上。选择题中关于进程和线程的区别是必考题:进程是资源分配的基本单位,线程是CPU调度的基本单位。同一个进程内的多个线程共享地址空间、文件描述符等资源,但每个线程有独立的栈和寄存器上下文。

有一道经典的辨析题我印象很深:多个线程并发执行时,如果对全局变量进行自增操作,最终结果是否一定等于线程数?答案是不一定。因为count++在底层不是一条原子指令,而是“读取-修改-写入”三步操作。两个线程可能同时读取到同一个旧值,各自加1后写回,导致结果比期望值少1。这个题目考察的是对竞争条件(race condition)的理解,也是引出锁和原子操作的最好切入点。

锁的方面,重点考察互斥锁和读写锁的区别:读多写少的场景适合读写锁,读写均匀或者写多的场景互斥锁反而更简单高效。死锁的四个必要条件(互斥、持有并等待、不可剥夺、循环等待)是笔试高频题,通常会让你分析某段加锁代码是否会产生死锁。

4.2 网络编程基础:TCP连接与I/O模型

网络题的分量虽然没有C语言基础那么重,但每套C方向笔试题里都会有几道。最基础的是TCP三次握手的过程,很多人的误区是把三次握手理解成“客户端发一次、服务端回一次、客户端再确认一次”就完事了,但没有想清楚每一步的作用。三次握手其实是双方确认各自的发送和接收能力都正常的过程:第一次握手服务端确认客户端的发送能力;第二次握手客户端确认服务端的接收和发送能力;第三次握手服务端确认客户端的接收能力。笔试中如果遇到“为什么需要第三次握手”这种问题,回答里一定要包含“防止已经失效的连接请求报文突然又传到服务端,导致错误建立连接”这一层。

I/O多路复用是爱奇艺这类高并发服务笔试的进阶题目,一般会考select和epoll的区别。select有三个核心限制:文件描述符数量上限、每次调用都要把fd集合从用户态拷贝到内核态、每次返回后要遍历整个fd集合才知道哪些就绪。epoll通过红黑树维护fd集合、通过回调机制将就绪fd放入就绪队列,解决了这三个问题。当时我看到爱奇艺笔试中有一道题是“epoll为什么比select高效”,本质上就是要你说清楚这三点。

4.3 Linux常用命令与调试基本功

这套笔试题里关于Linux的部分占比不高,但有一道题我觉得很能反映工程素养:给出了一个程序编译报错信息,让你判断是什么问题。这类题考察的不只是命令记忆,而是对编译链接过程的理解。

C程序从源码到可执行文件要经历四个阶段:预处理、编译、汇编、链接。预处理阶段处理#include#define,编译阶段生成汇编代码,汇编阶段生成机器码的目标文件,最后链接阶段把多个目标文件和库文件合并成可执行文件。有一个经典错误是:声明了函数但没有定义,编译时通过了,链接时却报undefined reference错误。这个问题的排查思路很明确:先检查函数名有没有拼写错误,再检查对应的源文件有没有参与编译,最后检查有没有链接对应的库。

gdb调试的基本命令也是C方向笔试的常客:break设置断点、print打印变量值、backtrace查看函数调用栈、nextstep的区别(next不进入函数内部,step会进入)。还有排查内存问题的工具valgrind,它的--leak-check=full参数可以详细报告每一处内存泄漏的位置,笔试里如果问“如何检测内存泄漏”,回答这个工具比只背概念要加分得多。

5. 编程题实战还原:手写代码的完整过程

5.1 题目一:实现字符串逆序并统计字符出现次数

这道题综合性很强,把字符串处理、指针操作和哈希表应用放在了一起。题目要求是:输入一个字符串,输出它的逆序字符串,同时统计每个字符出现的次数,并按出现次数从高到低排序输出。

核心实现思路分三步走。第一步用双指针法逆序字符串,注意要原地操作。第二步用数组模拟哈希表统计字符频率,因为字符最多只有256种,用一个int count[256]就够了,这是C语言里替代哈希表最常用也最高效的方式。第三步把字符和频率封装成结构体排序。完整参考代码如下:

#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char ch; int cnt; } CharCount; void reverse_str(char *s) { int left = 0; int right = strlen(s) - 1; while (left < right) { char tmp = s[left]; s[left] = s[right]; s[right] = tmp; left++; right--; } } int cmp(const void *a, const void *b) { return ((CharCount *)b)->cnt - ((CharCount *)a)->cnt; } int main() { char s[1024]; printf("请输入字符串: "); scanf("%s", s); reverse_str(s); printf("逆序结果: %s\n", s); int count[256] = {0}; for (int i = 0; s[i] != '\0'; i++) { count[(unsigned char)s[i]]++; } CharCount items[256]; int n = 0; for (int i = 0; i < 256; i++) { if (count[i] > 0) { items[n].ch = (char)i; items[n].cnt = count[i]; n++; } } qsort(items, n, sizeof(CharCount), cmp); printf("字符频率统计(降序):\n"); for (int i = 0; i < n; i++) { printf("'%c' 出现 %d 次\n", items[i].ch, items[i].cnt); } return 0; }

这段代码里有几个关键细节值得说明。第一,统计时把char强制转换成unsigned char,避免ASCII码大于127的字符在作为数组下标时变成负数。这个问题我当年写代码时踩过,一旦输入包含扩展ASCII字符,程序就会越界访问,输出乱码甚至崩溃。第二,qsort的比较函数返回值要从大到小排列,所以用b->cnt - a->cnt而不是a->cnt - b->cnt。第三,逆序处理的时候,字符串末尾的\0不能动,所以rightstrlen(s) - 1开始,不会错误地把结束符交换到字符串头部。

5.2 题目二:手写一个线程安全的LRU缓存

这道编程题是整套卷子里最有区分度的一题,考察了数据结构组合、指针操作、线程安全三个层面的能力。题目要求实现一个容量固定的LRU缓存,支持getput两个操作,并且要保证在多线程环境下安全访问。

我的参考实现思路是用一个双向链表配合哈希表。在C语言里没有标准库的哈希表,所以需要一个简单的哈希函数和链表节点数组配合。这里我用到的方法叫“数组模拟双向链表”,提前分配好节点数组,每个节点有一个前驱下标和后继下标,这样既避免了大量malloc/free带来的性能开销,也能让内存管理变得简单可控。

线程安全方面,最简单的方案是给整个缓存加一把大锁,这种做法在getput操作上都是互斥的。面试官可能会进一步问“能不能用细粒度锁优化”,这时候要能说出读写锁的思路:读操作可以并发,写操作必须独占。

下面是我在笔试中会写出的核心代码结构:

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #define CAPACITY 16 #define HASH_SIZE 256 typedef struct Node { int key; int value; int prev; int next; } Node; Node pool[CAPACITY]; int pool_count; int head, tail; int hash_table[HASH_SIZE]; pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; unsigned int hash(int key) { return (unsigned int)key % HASH_SIZE; } int find_node(int key) { int idx = hash_table[hash(key)]; while (idx != -1) { if (pool[idx].key == key) { return idx; } idx = -1; // 这里用拉链法时保存next,简化实现时用顺序查找 } return -1; } void move_to_head(int idx) { if (idx == head) return; // 从当前位置摘除节点,然后插入到head之前 int p = pool[idx].prev; int n = pool[idx].next; if (p != -1) pool[p].next = n; if (n != -1) pool[n].prev = p; if (idx == tail) tail = pool[idx].prev; pool[idx].prev = -1; pool[idx].next = head; if (head != -1) pool[head].prev = idx; head = idx; } int cache_get(int key) { pthread_rwlock_rdlock(&rwlock); int idx = find_node(key); if (idx == -1) { pthread_rwlock_unlock(&rwlock); return -1; } int value = pool[idx].value; pthread_rwlock_unlock(&rwlock); pthread_rwlock_wrlock(&rwlock); move_to_head(idx); pthread_rwlock_unlock(&rwlock); return value; }

这里我简化了哈希冲突处理,用find_node做了一个线性查找。但要注意一个问题:在cache_get里第一个读锁释放之后、第二个写锁获取之前,其他线程可能修改这个节点,所以这种写法严格来说还需要进一步加锁保护,比如用一个读锁把查找和move合并起来,或者直接用互斥锁保证一致性。笔试中如果时间紧张,直接上一把互斥锁是最安全的,不必为了追求高性能而引入复杂同步逻辑导致bug。实际生产中肯定要设计得更精细,但笔试考察的更多是你有没有意识到并发访问的问题。

6. 备战时踩过的坑和我的建议

6.1 时间分配与做题顺序

爱奇艺这套题的选择题数量不算少,加上后面的编程题,考试时间其实很紧张。我建议的做题顺序是:先花5分钟快速浏览全卷,把编程题的题目要求看一遍,心里先有个大概思路,然后从选择题开始做,遇到卡壳的题不要死磕,先标记一下跳到下一题,最后留出充足时间写编程题。

编程题一定要先写注释再写代码。注释里写明思路、数据结构设计、时间复杂度和空间复杂度,即使代码没能完整跑通,阅卷人也能看到你的思考过程。这道题考察的不仅是结果,更是分析过程,我见过不少因为注释写得清晰而拿到高分的情况。优先级上,字符串逆序和链表反转这类基础题应该保证100%做对,LRU这类综合题能做多少是多少,写出核心数据结构和基本框架就能拿到一半分数。

6.2 容易忽略的失分点

整理这套题的过程中,我总结了几个反复出现的失分点,想单独列出来提醒一下。

第一个是函数签名问题。笔试编程题经常要求你自己定义函数接口,很多人在getput这类函数命名和参数设计上随性发挥,最后虽然逻辑对了,但因为没有按题目要求实现,被判为不通过。考前一定要仔细读题,看清楚函数的输入输出格式、变量命名是否要求统一、返回值的含义是什么。

第二个是边界条件。反转链表时链表为空怎么办、缓存容量为1时怎么办、字符串为空字符串怎么办,这些测试用例在笔试的评测系统里基本都会覆盖。我习惯在写完核心逻辑后,花一分钟把空值、单元素、满容量这三种情况在脑子里跑一遍,能提前堵住大部分bug。

第三个是内存释放。C语言编程题最容易扣分的就是内存泄漏。只要用了malloc,就要想清楚在哪个分支上free。如果提交的代码在循环里反复分配内存但从不释放,评测系统即使不报错,也会因为内存占用过高而超时。这是C方向笔试和Java、Python方向笔试最大的不同,也是很多从其他语言转过来的同学最不适应的地方。

这套爱奇艺2020校招C方向第二场笔试题,整体难度对认真刷过题的同学来说是中等偏上,没有特别偏门的题目,但每道题都考察得足够细。准备的思路其实很明确:C语言基础部分用《C程序设计语言》和刷题网站反复练习指针和内存相关的题;数据结构部分把链表、哈希表、队列的基本操作练到能盲写;操作系统和网络按面试高频题背诵关键点并理解原理;最后一定不要忽略Linux和gdb的基本功。把这些都准备扎实了,不仅这套题能拿高分,后面面试手写代码的环节也会轻松很多。

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

开源RAG引擎RAGFlow深度解析:文档解析、知识库问答与私有化部署实践

这次我们直接看一个最近讨论度很高的开源 RAG 引擎&#xff1a;RAGFlow&#xff0c;来自 InfiniFlow 团队。如果你正在做知识库、文档问答、私有化部署&#xff0c;或者想把一堆 PDF、Word、PPT 喂给大模型做精准检索&#xff0c;这个项目值得认真研究一下。RAGFlow 的核心思路…

作者头像 李华
网站建设 2026/9/6 4:19:05

深度优先搜索算法(3)——习题简述(2)

本节将给出以下题的题解&#xff1a; P1123 取数游戏P1605 迷宫P1644 跳马问题P1219 八皇后 代码仓库链接&#xff1a;https://github.com/zhenghan123456/algotithm_programming 在这里建议每道题都认真思考&#xff0c;习题题解只是简单表明一下思路&#xff0c;不会和例题…

作者头像 李华
网站建设 2026/9/6 10:19:59

Agent Harness 实战:从本地部署到批量任务与API接入的完整指南

Harness 这个词最近在开发者社区里热度上升得很快。它频繁和 DeepSeek、Codex 放在一起讨论&#xff0c;已经不再只是 CI/CD 工具链里的那个 Harness 产品名&#xff0c;而是一类被称为agent harness的工作流控制层。简单说&#xff0c;光有大模型还不够&#xff0c;你要给 Age…

作者头像 李华
网站建设 2026/9/9 3:34:07

从零实现MiniPin:彻底理解Rust中Pin的移动禁止机制

Rust 里的Pin一直是新手和老手之间的一道分水岭。很多人会用Box::pin包一个Future&#xff0c;但问他Pin到底保证了一件什么事&#xff0c;往往答不上来&#xff1b;也有人见过Pin<&mut T>出现在Future::poll签名里&#xff0c;却很难解释它为什么必须长这样。这篇文…

作者头像 李华
网站建设 2026/9/5 22:53:01

IDM下载器实战教程:多线程加速与视频嗅探全解析

最近把 IDM 的实战用法整理成了一期视频&#xff0c;结果不少朋友在评论区问有没有配套文字版&#xff0c;方便边看边操作。这篇文章就作为视频的文字版教程&#xff0c;把 IDM 下载器从安装、设置、核心功能到常见问题完整过一遍。无论你是第一次接触 IDM&#xff0c;还是已经…

作者头像 李华
网站建设 2026/9/5 12:39:20

基于YOLO的人脸识别考勤系统实战:从目标检测到工程落地

简介&#xff1a;本资源是一个基于YOLO算法实现的人脸识别考勤系统完整工程&#xff0c;面向深度学习初学者、计算机视觉课程设计与本科毕业设计实践者&#xff0c;解决传统人工考勤效率低、易代打卡等管理痛点。项目采用YOLOv8&#xff08;或兼容版本&#xff09;进行人脸检测…

作者头像 李华