名企AI面试100题:计算机语言基础与算法高频考点解析

发布时间:2026/10/24 15:49:44
名企AI面试100题:计算机语言基础与算法高频考点解析

简介:《名企AI面试100题》PDF资料面向备战互联网名企AI岗位的求职者与在校学生,聚焦计算机语言基础、算法与大数据、机器学习、深度学习及应用方向等核心考点,帮助读者在有限时间内高效梳理高频笔试面试题。资源包内含1个PDF文件,大小约49.22MB,内容按章节组织,涵盖C++的extern "C"、多线程与多任务、Java类初始化顺序、死锁编写、ArrayList遍历删除、Linux CPU与进程查看、iptables规则、Python去重与快排等典型题目,每题均配有解析思路与代码示例。该资料源自七⽉在线近4000道题库的精选题集,题目顺序与官网保持一致,便于对照讨论与查漏补缺。目前已有251人学习下载,适合需要系统刷题、快速复盘语言基础与算法细节的读者参考使用。

1. 计算机语言基础:从 extern "C" 到 Python 去重,名企 AI 面试的第一道门槛

很多人以为 AI 岗面试上来就是 SVM、Transformer,结果一面挂在了extern "C"和 Java 类初始化顺序上。这份《名企AI面试100题》把计算机语言基础放在第 1 章,不是凑数——它对应的是笔试/面试里最容易被忽视、也最容易拉开差距的“基本功筛选题”。这一章覆盖 C/C++、Java、Linux、Python 四类语言的基础考点,题目难度不大,但面试官往往通过它们判断你的工程素养是否扎实。适合正在准备 AI 方向笔试面试、但语言基础已经有些生疏的候选人。下面按考点模块拆开讲,每道题都给答题思路和易错提醒。

1.1 C++ 与 C 混合编程:extern "C" 到底在解决什么问题

这道题几乎每份 C++ 面试题库都会出现,但能答到点子上的人不多。面试官最想听的不是“加 extern C 就能调用”,而是你理解name mangling(名称修饰)这个机制。

C++ 支持函数重载,编译器会把函数名和参数类型一起编码进符号名,比如void foo(int, int)编译后可能变成_foo_int_int;而 C 编译器不做这种修饰,foo就是_foo。当 C++ 程序去链接一个由 C 编译器生成的目标文件时,链接器拿着修饰过的名字去找,自然找不到。

答题思路分三步走:

  1. 先点明 extern 本身是作用域声明关键字,extern "C" 是链接声明(linkage declaration)。
  2. 解释 C++ 名称修饰机制,说明为什么 C++ 编译后的符号名和 C 不一样。
  3. 落到实际用法:在 C++ 中引用 C 头文件时用extern "C" { #include "xxx.h" }包起来;反过来 C 引用 C++ 函数时,C++ 头文件里加 extern "C",但 C 文件里只能声明为 extern 类型,不能直接包含带 extern "C" 的头文件。
// C++ 中调用 C 函数的正确写法 extern "C" { #include "cExample.h" // C 头文件里声明的是 extern int add(int, int); } int main() { add(2, 3); // 链接器按 C 规则找 _add,而不是 _add_int_int return 0; }

注意:如果模块 A 声明了 extern "C" 而模块 B 没有,链接阶段会直接报 undefined reference,这是最常见的翻车点。

1.2 Java 类初始化顺序:静态块、普通块、构造函数的执行链条

这道题在笔试里经常以“写出下面代码的输出结果”形式出现,面试里则要求你口述完整顺序。结论先给:

基类静态代码块和静态成员字段(并列,按代码出现顺序,只执行一次)→ 派生类静态代码块和静态成员字段(同上)→ 基类普通代码块和普通成员字段(按出现顺序)→ 基类构造函数 → 派生类普通代码块和普通成员字段 → 派生类构造函数。

面试官想确认的是你分得清“类加载时执行”和“对象创建时执行”这两个时机。静态部分只在类第一次加载时跑一次,普通部分每次 new 对象都会跑。

答题时建议用一个最小例子说明,比如父类静态块打印 “Base Static”,子类静态块打印 “Child Static”,然后 new 子类对象,输出顺序一定是先 Base Static 再 Child Static,最后才是构造相关的输出。如果面试官追问“静态字段和静态块谁先”,答案是按代码中出现的先后顺序,谁在前面谁先执行。

1.3 多线程与死锁:概念辨析和手写代码

“什么是多线程,多线程与多任务有什么区别”是概念题,但“写一个死锁”是动手题,两者经常连着考。

多线程是进程内的概念,一个程序可以同时跑多个线程,共享进程内存空间;多任务是操作系统层面的概念,指同时运行多个独立进程,每个进程有自己独立的内存空间。面试官最想听到的关键区别是:多线程共享资源,多任务不共享。

手写死锁的答题模板:

public class DeadLockDemo { private static final Object lock1 = new Object(); private static final Object lock2 = new Object(); public static void main(String[] args) { new Thread(() -> { synchronized (lock1) { System.out.println("Thread A holds lock1"); try { Thread.sleep(100); } catch (InterruptedException e) {} synchronized (lock2) { System.out.println("Thread A gets lock2"); } } }).start(); new Thread(() -> { synchronized (lock2) { System.out.println("Thread B holds lock2"); try { Thread.sleep(100); } catch (InterruptedException e) {} synchronized (lock1) { System.out.println("Thread B gets lock1"); } } }).start(); } }

两个线程分别持有 lock1 和 lock2,再互相请求对方持有的锁,形成循环等待。写完之后补一句:死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待,破坏任意一个就能避免死锁。

1.4 Linux 与 Python 实操题:命令和代码都要能落地

这部分题目偏实操,面试官看重的是你平时是否真的用过,而不是背过。

查看 CPU 信息:lscpu一条命令就能看到物理 CPU 数量、每颗核数、线程数。面试时如果追问“物理 CPU 和逻辑 CPU 的区别”,答“物理 CPU 是硬件插槽上的芯片数,逻辑 CPU 是核数乘以超线程数”。

top 命令看内存:%Mem列是内存使用率,RES是驻留内存大小,SHR是共享内存大小。别把 VIRT 当成实际内存占用,那是虚拟内存,包含未实际分配的地址空间。

iptables 拒绝特定 IP 访问 80 端口:

iptables -A INPUT -s 192.168.1.101 -p tcp --dport 80 -j DROP

参数含义:-A INPUT追加到入站规则链,-s指定来源 IP,-p tcp协议,--dport 80目标端口,-j DROP直接丢弃不回应。

Python 删除 list 重复元素:

my_list = [1, 2, 2, 3, 3, 3, 4, 5, 5] # 方法一:set 去重,不保证顺序 my_list = list(set(my_list)) # 方法二:保序去重,用 dict.fromkeys my_list = list(dict.fromkeys(my_list))

面试官通常会追问“set 去重后顺序变了吗”,答案是变了,因为 set 是无序的。如果要保序,用dict.fromkeys或者手动遍历加辅助集合。

Python 拷贝对象的区别:赋值是引用传递,浅拷贝只复制顶层对象,深拷贝递归复制所有嵌套对象。面试时举一个嵌套 list 的例子就能说清楚。

1.5 易错点:这五道题最容易丢分

第一错:extern "C" 说成“让 C++ 能调用 C”就完了。错在没解释 name mangling 机制。面试官要的是你理解链接器层面的符号匹配问题,不是背结论。答对的关键是先讲 C++ 函数重载导致符号名变化,再落到 extern "C" 让编译器按 C 规则生成符号。

第二错:Java 初始化顺序把静态块和普通块的执行时机搞混。错在没区分“类加载”和“对象创建”。静态部分只在类第一次加载时执行一次,普通部分每次 new 都执行。答对的关键是画一条时间线:类加载 → 静态初始化 → 对象创建 → 普通初始化 → 构造函数。

第三错:for 循环删除 ArrayList 元素时说不清为什么抛异常。错在只说“会报 ConcurrentModificationException”但没解释 modCount 机制。ArrayList 的迭代器每次 next() 会检查 modCount 是否等于 expectedModCount,删除操作会修改 modCount,导致检查失败。答对的关键是提 Iterator.remove() 或者 removeIf() 是安全的,因为迭代器内部同步更新了 expectedModCount。

第四错:top 命令里把 VIRT 当成内存占用。错在没区分虚拟内存和物理内存。VIRT 包含进程申请但未实际使用的地址空间,RES 才是真正占用的物理内存。答对的关键是记住三个指标:VIRT 虚拟内存、RES 驻留内存、SHR 共享内存。

第五错:Python 去重只说 set 不说顺序问题。错在忽略了业务场景中对顺序的要求。答对的关键是主动提“set 去重不保序,如果需要保序用 dict.fromkeys 或手动遍历”。

2. 算法和大数据:手写代码与海量数据处理的答题套路

算法题是 AI 岗面试的重头戏,这一章覆盖链表、树、数组、动态规划以及 Hadoop/Spark 和海量数据处理。面试官出这类题,一是看你代码功底,二是看你能不能把思路讲清楚。下面按题型拆解答题模板。

2.1 链表与树:判断环、B 树操作、有序链表转 BST

判断单链表是否有环:经典解法是快慢指针。快指针每次走两步,慢指针每次走一步,如果相遇则有环。面试时先口述思路再写代码:

class ListNode: def __init__(self, val=0): self.val = val self.next = None def has_cycle(head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: return True return False

面试官常追问“如何找到环的入口”。答案是相遇后把慢指针重置到头节点,两个指针每次各走一步,再次相遇的位置就是环的入口。推导过程用数学公式说明:设头到入口距离为 a,入口到相遇点为 b,相遇点到入口为 c,则 a = c。

B 树的插入和删除:面试里不会让你手写完整 B 树,但会问插入时节点满了怎么办(分裂)、删除时节点下溢怎么办(借位或合并)。答题时抓住“保持所有叶子在同一层”这个核心性质展开。

有序链表转换二叉搜索树:思路是找中间节点作为根,递归处理左右两部分。可以用快慢指针找中点,也可以先把链表转成数组再二分。

2.2 数组与动态规划:子序列、连续子数组、路径和

最大连续子数组和:经典 Kadane 算法,状态转移方程dp[i] = max(dp[i-1] + nums[i], nums[i])。

def max_subarray(nums): max_sum = cur_sum = nums[0] for num in nums[1:]: cur_sum = max(num, cur_sum + num) # 要么接上前面,要么从当前重新开始 max_sum = max(max_sum, cur_sum) return max_sum

面试官会追问“如果要求返回子数组的起止下标怎么办”,答“额外记录起始位置,当 cur_sum 重新开始时更新临时起点,当 max_sum 更新时保存临时起点和终点”。

金字塔最小路径之和:二维动态规划,从底部往上推。dp[j] = min(dp[j], dp[j+1]) + triangle[i][j],空间复杂度可以优化到 O(n)。

最长连续递增序列:一次遍历,维护当前连续长度和最大长度。注意是“连续”递增,不是最长递增子序列,两者解法完全不同。

2.3 海量数据处理:Hadoop/Spark 区别与 Top K 问题

Hadoop 和 Spark 的异同:相同点是都做并行计算。区别在于 Hadoop 的 MapReduce 基于磁盘,每轮迭代都要读写 HDFS;Spark 基于内存,用 RDD 做弹性分布式数据集,迭代计算快得多。面试时补一句“Spark 适合迭代式机器学习,Hadoop 适合一次性批处理”。

寻找重复出现次数最多的前 100 个关键字:标准答法是分治加哈希。先对海量数据做哈希取模分成 N 个小文件,每个小文件用 HashMap 统计词频,再用最小堆选出每个文件的前 100,最后归并所有小文件的结果。

从海量日志中找访问次数最多的 IP:同样的分治思路。先哈希分文件,再统计,最后归并。面试官可能追问“如果某个 IP 特别热,哈希后还是集中在一个文件怎么办”,答“换哈希函数或者对该文件二次拆分”。

3. 机器学习:从 SVM 到 XGBoost 的高频考点与答题模板

机器学习是 AI 面试的核心章节,这份题库里占了 29 道题。面试官考察的重点不是推导细节,而是你能否用通俗语言解释算法原理、说清优缺点和适用场景。下面按考点模块拆解。

3.1 SVM 与树模型:原理、归一化和离散化

SVM 原理:面试官最想听的是三个关键词——最大间隔、支持向量、核函数。答题框架:SVM 寻找一个超平面,使得正负样本到超平面的最小距离最大化;决定这个超平面的只有支持向量;当线性不可分时,用核函数把数据映射到高维空间使其线性可分。如果追问“软间隔和硬间隔的区别”,答“硬间隔要求所有样本都分类正确,软间隔引入松弛变量允许部分样本越界,用参数 C 控制惩罚力度”。

树形结构为什么不需要归一化:因为决策树每次分裂只看特征的一个阈值,比如“年龄 > 30”,特征缩放不改变分裂点的相对顺序。而 SVM、KNN、神经网络这些基于距离或梯度的算法,特征量纲不同会导致距离计算失真或收敛变慢。

逻辑回归为什么要对特征离散化:离散化后每个特征取值变成一个独立的权重,模型表达能力更强;离散化对异常值更鲁棒;稀疏向量内积计算快。面试时补一句“工业界常用等频分箱或卡方分箱”。

3.2 过拟合、梯度下降与 XGBoost

过拟合怎么解决:答题分四个方向——增加数据量、正则化(L1/L2)、Dropout(深度学习)、早停(Early Stopping)。面试官可能追问“L1 和 L2 正则的区别”,答“L1 产生稀疏解可以做特征选择,L2 让权重趋向于小值但不为零”。

梯度下降法:先说三种变体——批量梯度下降(BGD)、随机梯度下降(SGD)、小批量梯度下降(Mini-batch GD)。BGD 每次用全部样本计算梯度,稳定但慢;SGD 每次用一个样本,快但震荡;Mini-batch 折中,是实际最常用的。

XGBoost 为什么要用泰勒展开:因为原损失函数可能很复杂,二阶泰勒展开后得到一个统一的二次函数形式,可以直接求出最优叶子权重和分裂增益,把优化问题简化成解析解。面试时补一句“GBDT 只用了一阶导数,XGBoost 用了二阶,收敛更快更准”。

3.3 判别式 vs 生成式、EM 算法、贝叶斯定理

判别式模型和生成式模型:判别式直接建模 P(y|x),如逻辑回归、SVM、决策树;生成式建模 P(x,y),如朴素贝叶斯、隐马尔可夫。判别式通常分类精度更高,生成式能处理缺失数据且样本需求更少。

EM 算法:分两步——E 步根据当前参数估计隐变量的期望,M 步最大化期望似然更新参数。反复迭代直到收敛。面试时举高斯混合模型的例子说明最直观。

贝叶斯定理:P(A|B) = P(B|A) * P(A) / P(B)。面试官想听的是你对先验、似然、后验三个概念的理解,以及朴素贝叶斯“特征条件独立假设”的含义和局限性。

3.4 特征工程与模型评估:AUC、特征选择、降维

AUC 的物理意义:随机抽一个正样本和一个负样本,模型给正样本打分高于负样本的概率就是 AUC。AUC = 0.5 相当于随机猜,AUC = 1 是完美分类。面试时补一句“AUC 对类别不平衡不敏感,这是它比准确率好的地方”。

特征选择方法:过滤法(方差选择、卡方检验、互信息)、包裹法(递归特征消除)、嵌入法(L1 正则、树模型特征重要性)。面试时按“计算成本从低到高”的顺序说。

降维方法:PCA 做线性降维,通过特征值分解保留方差最大的方向;t-SNE 做非线性降维,适合可视化。面试官可能追问“PCA 和 LDA 的区别”,答“PCA 是无监督的,LDA 是有监督的,LDA 最大化类间距离同时最小化类内距离”。

3.5 集成学习:RF、GBDT、XGBoost、Adaboost 的区别与联系

这是面试高频区,建议用一张对比表说清楚:

算法并行/串行核心思想关键参数
随机森林并行Bagging + 特征随机采样n_estimators, max_depth
GBDT串行拟合前一轮残差learning_rate, n_estimators
XGBoost串行二阶泰勒展开 + 正则化max_depth, lambda, alpha
Adaboost串行调整样本权重,关注错分样本n_estimators, learning_rate

面试官最常问的是“RF 和 GBDT 的区别”。答:RF 是并行训练多棵树然后投票,降低方差;GBDT 是串行训练,每棵树拟合前面所有树的残差,降低偏差。XGBoost 在 GBDT 基础上加了二阶导、正则化、并行特征分裂查找等优化。

4. 深度学习:CNN、RNN、Transformer 的必考知识点

深度学习章节覆盖 15 道题,从激活函数到注意力机制都有。面试官考察的是你对网络结构的理解深度,以及调参经验。

4.1 归一化、激活函数与梯度问题

归一化和标准化的区别:归一化把数据缩放到 [0,1],公式(x - min) / (max - min);标准化把数据变成均值 0 方差 1,公式(x - mean) / std。面试时补一句“图像数据常用归一化,表格数据常用标准化”。

ReLU 为什么比 Sigmoid 和 tanh 好:Sigmoid 和 tanh 在饱和区梯度接近零,导致梯度消失;ReLU 在正区间梯度恒为 1,缓解了梯度消失,且计算简单。面试官可能追问“ReLU 的缺点是什么”,答“负区间梯度为零,可能导致神经元死亡,用 Leaky ReLU 或 ELU 可以缓解”。

梯度消失和梯度爆炸:梯度消失是深层网络中梯度逐层相乘后趋近于零,参数不更新;梯度爆炸是梯度逐层相乘后变得极大,参数更新过猛。解决方法包括:换 ReLU 激活函数、用 Batch Normalization、残差连接、梯度截断。

4.2 CNN 与 RNN:从卷积到 LSTM

CNN 基本原理:卷积层用卷积核在输入上滑动做局部加权求和,提取局部特征;池化层降采样,减少参数量;全连接层做分类。面试时补一句“卷积的权值共享和局部连接大大减少了参数量”。

RNN 到 LSTM:RNN 的隐藏状态每一步都传递,但长序列中梯度消失导致记不住远距离信息。LSTM 引入三个门——遗忘门决定丢弃哪些信息,输入门决定写入哪些新信息,输出门决定输出哪些信息。面试时画一个简单的门控示意图比纯文字更清楚。

NMS 非极大值抑制:目标检测中,同一个物体可能被多个框检测到,NMS 按置信度排序,保留最高的框,然后删除与它 IOU 超过阈值的框,重复直到处理完所有框。

4.3 注意力机制与 Transformer

注意力机制通俗理解:给定一个查询 Q,用它与每个键 K 计算相似度,归一化后作为权重,对值 V 加权求和。面试时用“查字典”类比:Q 是你要查的词,K 是字典的索引,V 是索引对应的解释。

Transformer 核心结构:编码器由多头自注意力和前馈网络组成,解码器多了一个交叉注意力层。面试官最想听的是“自注意力怎么算的”:

import numpy as np def scaled_dot_product_attention(Q, K, V): d_k = Q.shape[-1] scores = np.dot(Q, K.T) / np.sqrt(d_k) # 缩放点积 weights = np.exp(scores) / np.exp(scores).sum(axis=-1, keepdims=True) # softmax return np.dot(weights, V)

参数说明:Q、K、V 都是输入序列的线性变换,d_k 是键的维度,除以 sqrt(d_k) 是为了防止点积过大导致 softmax 梯度消失。

BN(Batch Normalization):对每个 mini-batch 做归一化,使激活值均值 0 方差 1,然后引入可学习的缩放和平移参数。面试时补一句“BN 在训练时用 batch 统计量,推理时用全局统计量”。

5. 应用方向:CV、NLP、推荐、风控的押题思路与答题技巧

最后一章落到应用方向,这份题库覆盖了目标检测、NLP 预训练、推荐系统和金融风控。面试官出这类题,看的是你能否把算法和业务场景结合起来。

5.1 CV 方向:目标检测与图像特征

目标检测技术演进:从 R-CNN 到 Fast R-CNN 到 Faster R-CNN,再到 YOLO 和 SSD。面试时按“两阶段 vs 单阶段”分类说:两阶段先生成候选框再分类,精度高但慢;单阶段直接回归框和类别,速度快但小物体检测稍弱。

IOU 评价函数:交并比,预测框和真实框的交集面积除以并集面积。面试官可能追问“IOU 有什么缺点”,答“如果两个框不相交,IOU 为零,梯度消失,所以有了 GIOU、DIOU、CIOU”。

感受野:卷积神经网络中,输出特征图上一个像素点对应输入图像上的区域大小。面试时补一句“感受野越大,能看到的上下文信息越多,但计算量也越大”。

5.2 NLP 方向:从 Word2Vec 到 BERT

TF-IDF:TF 是词频,IDF 是逆文档频率,两者相乘衡量一个词对文档的重要性。面试时补一句“TF-IDF 的缺点是没考虑词的位置和语义”。

Word2Vec:两种训练方式——CBOW 用上下文预测中心词,Skip-gram 用中心词预测上下文。面试时用“国王 - 男人 + 女人 ≈ 女王”这个经典例子说明词向量的语义关系。

从 Word Embedding 到 BERT:Word2Vec 是静态词向量,同一个词在不同语境下向量相同;ELMo 用双向 LSTM 做动态词向量;BERT 用 Transformer 编码器和掩码语言模型,真正实现了上下文相关的词表示。

5.3 推荐与风控:协同过滤、冷启动、WOE 编码

协同过滤:基于用户(找相似用户推荐他们喜欢的物品)或基于物品(找相似物品推荐给用户)。面试时补一句“协同过滤的缺点是冷启动和稀疏性问题”。

冷启动:新用户或新物品没有历史数据。解决方法:利用注册信息做粗粒度推荐、推热门物品、用知识图谱补充物品属性。

WOE 编码:Weight of Evidence,计算每个分箱中正负样本比的对数。面试时补一句“WOE 编码后特征与目标变量呈线性关系,且能处理缺失值”。

5.4 答题技巧:从审题到收尾的完整流程

面试答题最怕的是“想到哪说到哪”。我自己的习惯是每次拿到题先花 10 秒在脑子里过一遍结构:定义 → 原理 → 优缺点 → 应用场景 → 延伸。比如被问到 XGBoost,先说“XGBoost 是梯度提升树的优化实现”,再讲“它用二阶泰勒展开和正则化”,然后说“优点是精度高、支持并行,缺点是参数多、调参复杂”,最后补一句“工业界常用于 CTR 预估和风控评分卡”。

还有一条血泪经验:不会的题不要硬编。面试官最反感的是胡扯。正确的做法是先说“这个点我了解得不够深入”,然后把你确定知道的相关知识说出来,最后补一句“面试结束后我会重点补这块”。这样既诚实又展示了学习态度。

押题方向上,建议重点准备三类题:一是你简历上写了的项目相关算法,面试官一定会追问细节;二是高频基础题,比如 SVM、XGBoost、Transformer,几乎每场必考;三是业务场景题,比如“给你一个不平衡数据集怎么处理”“推荐系统怎么解决冷启动”。这三类题准备到位,面试通过率会明显提升。

从那以后我每次面试前都强制走一遍这个流程:把简历上的项目对应的算法原理、优缺点、调参经验各写一遍,再找三五个高频题手写代码或口述思路。希望帮到你。

本文还有配套的精品资源,点击获取