Skip to content

Basic_Algorithms_Math 面试专题手册

💡 本章节共收录 5120 道面试真题,建议每天复习 10-20 题。


Q1: Java线程池如何自定义拒绝策略?

【核心解析】 理解ThreadPoolExecutor的RejectedExecutionHandler接口;实现自定义拒绝策略类,如记录日志、重试、降级处理等;在创建线程池时通过构造参数或setRejectedExecutionHandler方法设置;常见内置拒绝策略(AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy)的适用场景。


Q2: 在不重启服务的情况下,如何动态调整线程池参数?

【核心解析】 使用ThreadPoolExecutor提供的setCorePoolSize、setMaximumPoolSize、setKeepAliveTime等方法动态修改;通过配置中心(如Apollo、Nacos)监听参数变更并回调更新;注意线程池预热和任务队列容量调整的限制;动态调整时需考虑线程安全与并发问题。


Q3: 线程池动态刷新时,是直接替换整个线程池对象,还是调用内部API修改?

【核心解析】 优先使用内部API修改,避免替换对象带来的任务丢失和状态不一致;替换整个线程池对象需要处理旧线程池的优雅关闭和新线程池的初始化;内部API修改更轻量且线程安全;在特殊场景(如需要改变任务队列类型)下才考虑替换。


Q4: MySQL分页查询(Deep Pagination)在数据量大时为什么会变慢?

【核心解析】 OFFSET过大导致数据库需要扫描并丢弃大量行;传统LIMIT OFFSET方式随着偏移量增加性能线性下降;索引覆盖不全时需回表查询,IO开销大;可优化为基于游标的分页或使用子查询先定位ID。


Q5: 慢SQL排查:除了索引缺失和数据量大,还有哪些因素会导致SQL变慢?

【核心解析】 锁等待(行锁、表锁、间隙锁)导致阻塞;数据库连接池耗尽或连接数过多;长事务未提交导致undo log膨胀和锁持有时间过长;系统负载高(CPU、内存、磁盘IO);查询语句本身写法低效(如SELECT *、函数操作索引列);统计信息不准确导致优化器选择错误执行计划。


Q6: 描述图的最短路径遍历算法思路。

【核心解析】 Dijkstra算法:适用于非负权图,使用优先队列贪心选择当前最短距离节点,松弛邻接边;Bellman-Ford算法:可处理负权边,通过V-1轮松弛操作检测负环;Floyd-Warshall算法:动态规划求所有点对最短路径,三重循环枚举中间节点;A*算法:引入启发式函数,在有权图中高效搜索最短路径;算法复杂度及适用场景对比。


Q7: C++新标准了解吗?类型推导、左值和右值、move语句。

【核心解析】 C++11/14/17/20新特性概览;auto和decltype类型推导规则及使用场景;左值(可寻址)与右值(临时对象)的概念区分;std::move将左值转换为右值引用,实现移动语义,避免不必要的拷贝;移动构造函数和移动赋值运算符的作用;完美转发与std::forward。


Q8: 如果创建一个类不声明构造函数,默认编译器会创建哪些构造函数?

【核心解析】 默认构造函数(无参,执行默认初始化);拷贝构造函数(浅拷贝成员变量);拷贝赋值运算符(浅拷贝成员变量);移动构造函数(C++11起,若未声明拷贝/移动/析构则生成);移动赋值运算符(同上);析构函数(非虚,执行默认清理)。


Q9: 有序链表删除重复元素,用Python写,之后又问C++写的话有什么区别。

【核心解析】 Python实现:遍历链表,比较当前节点与下一节点的值,若相同则跳过重复节点;注意处理空链表和头节点;C++实现:需手动管理内存,删除重复节点时释放内存;指针操作更底层,需注意空指针和野指针;C++可定义链表结构体/类,Python可直接使用对象引用;语言特性差异:Python自动垃圾回收,C++需显式delete。


Q10: 在一个 m*n 矩阵中寻找一条最大路径,从左上角到右下角,每次只能向右和向下走一步,求到 (m,n) 处的最大路径的和。

【核心解析】 动态规划定义:dp[i][j] 表示到达 (i,j) 的最大路径和;状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j];初始化:dp[0][0] = grid[0][0],第一行和第一列累加;复杂度:时间复杂度 O(mn),空间复杂度 O(mn) 或优化为 O(n);扩展:最小路径和、路径数目、带障碍物、允许其他方向移动等变种


Q11: 手撕代码:贪心+单调栈

【核心解析】 贪心算法的适用场景与证明;单调栈的原理与常见题型(如接雨水、每日温度);时间/空间复杂度分析;代码实现与边界处理


Q12: 线程和进程,TCP和UDP

【核心解析】 进程是资源分配单位,线程是CPU调度单位;线程共享内存,进程独立;TCP面向连接、可靠传输、拥塞控制;UDP无连接、低延迟、尽最大努力交付;适用场景对比;在Agent系统中网络通信协议的选择


Q13: 实现买卖股票的最佳时机算法(LeetCode 121)

【核心解析】 一次遍历,记录历史最低价格;计算当天卖出利润,更新最大利润;时间复杂度 O(n),空间复杂度 O(1);注意边界条件如空数组;可扩展至多次交易或含冷冻期等变种


Q14: 请手撕合并两个有序链表的代码。

【核心解析】 链表数据结构的定义;双指针遍历与比较逻辑;处理剩余节点的边界条件;时间与空间复杂度分析。


Q15: MySQL索引的优缺点是什么?

【核心解析】 索引加速查询(B+树结构);索引占用额外存储空间;写操作(INSERT/UPDATE/DELETE)性能下降;索引选择性与最左前缀原则;聚簇索引与非聚簇索引的区别


Q16: 在传统NLP分类任务中,常用的损失函数有哪些?

【核心解析】 交叉熵损失常用于分类训练目标;KL散度用于分布对齐和蒸馏;JS散度对称有界;Wasserstein距离在支撑集不重叠时提供平滑距离信号


Q17: 算法题:寻找峰值元素(LeetCode 162)。

【核心解析】 峰值元素指大于左右相邻值的元素;数组可能包含多个峰值,返回任意一个即可;二分查找法,时间复杂度 O(log n);比较中间元素与右侧元素,决定搜索方向;边界条件处理,如数组长度为1或单调情况。


Q18: 线程池的核心参数有哪些?JVM内存模型和GC机制了解哪些?

【核心解析】 线程池核心参数:核心线程数、最大线程数、存活时间、工作队列、拒绝策略;JVM内存模型:堆、栈、方法区、程序计数器等;GC算法:标记-清除、复制、标记-整理、分代收集;常见垃圾收集器:Serial、Parallel、CMS、G1等;理解内存分配和回收对性能调优至关重要。


Q19: MySQL的索引

【核心解析】 索引的数据结构(B+树);索引的类型(主键索引、唯一索引、普通索引、联合索引);索引的优缺点及使用场景;索引的底层存储原理;索引优化策略


Q20: MySQL的事务隔离级别

【核心解析】 四种隔离级别(读未提交、读已提交、可重复读、串行化);每种隔离级别解决的问题(脏读、不可重复读、幻读);MVCC实现原理;锁机制与隔离级别的关系;默认隔离级别及选择依据


Q21: Redis单线程如何支持高并发和高QPS?请从网络模型、内存操作、数据结构三个方面分析

【核心解析】 基于Reactor模式的I/O多路复用网络模型;纯内存操作,避免磁盘I/O;高效的数据结构设计(如SDS、跳表、压缩列表);单线程避免上下文切换和锁竞争;使用Pipeline和批量操作提升吞吐


Q22: Redis实例本身占10GB内存,但在RDB期间内存飙升到20GB,分析原因和优化方案

【核心解析】 RDB采用fork子进程,写时复制导致内存翻倍;fork时父进程内存页被复制;优化方案:使用无磁盘化复制、关闭THP、控制写入频率、使用AOF重写、升级Redis版本利用RDB无盘复制+增量复制


Q23: Redis缓存的key是什么

【核心解析】 Key是字符串类型;Key的命名规范(业务:模块:标识);Key的过期时间设置;Key的淘汰策略;避免大Key和热Key


Q24: 消息队列防止消息丢失的内部机制是什么(以RocketMQ至少一次投递为例)

【核心解析】 生产者端:同步发送、重试机制、事务消息;Broker端:同步刷盘、主从复制;消费者端:手动确认、消费重试;RocketMQ的至少一次投递保证:消息持久化、ACK机制、重试队列


Q25: 手撕:二叉树的右视图

【核心解析】 层序遍历,记录每层最后一个节点;或深度优先,记录深度和节点值,更新对应深度的值。


Q26: 算法手撕:中序遍历二叉树

【核心解析】 递归实现:左子树-根-右子树;迭代实现:使用栈模拟递归过程;时间复杂度O(n),空间复杂度O(h);Morris遍历可将空间优化至O(1);遍历顺序的变体(前序、后序)


Q27: 手撕算法:实现二叉树的中序遍历。

【核心解析】 中序遍历的顺序:左子树、根节点、右子树;递归实现:定义递归函数,先递归左子树,访问根,再递归右子树;迭代实现:使用栈模拟递归,先向左走到尽头,弹出访问,再转向右子树;时间复杂度和空间复杂度分析;处理空树等边界情况。


Q28: 给定一个二叉树,以及一个节点list,判断list中任意两个节点之间,是不是都存在“血缘关系”(A是B的祖先/B是A的祖先)。

【核心解析】 二叉树遍历(DFS/BFS);最近公共祖先(LCA);祖先关系判断;时间复杂度优化;并查集思想


Q29: 给定一个question list,每个item是一个[v,b],v表示解答该题目能够获得多少value,b表示解答该题目后有多少道题不能解答。求在当前list下,所能获得的最大value。(反向dp,时间复杂度为O(n))

【核心解析】 动态规划;状态定义与转移;反向DP思想;时间复杂度分析;背包问题变种


Q30: 手撕:求二叉树的最大宽度

【核心解析】 二叉树的层序遍历;使用队列记录节点和索引;每层宽度为最左和最右索引之差加一;注意空节点处理;时间复杂度O(n)


Q31: MySQL的ACID怎么实现的

【核心解析】 原子性通过undo log回滚;一致性由其他特性共同保证;隔离性通过锁和MVCC;持久性通过redo log和刷盘策略


Q32: 定期删除和redis的IO是一个线程吗

【核心解析】 Redis单线程处理命令;定期删除由主线程执行;惰性删除在访问时触发;过期键清理策略;IO多线程在6.0后引入但命令执行仍单线程


Q33: 手撕代码:二叉树的层序遍历。

【核心解析】 使用队列进行广度优先搜索;记录每层节点数量;时间复杂度O(n),空间复杂度O(n);注意空树处理;输出二维列表表示层序结果


Q34: 激活函数了解过吗,介绍一下

【核心解析】 常见激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、Softmax等)的公式与特点;激活函数在神经网络中的作用(引入非线性);梯度消失与梯度爆炸问题;不同激活函数的适用场景(如二分类输出层用Sigmoid,多分类用Softmax,隐藏层常用ReLU);激活函数的优缺点(如ReLU的稀疏激活性和Dead ReLU问题)


Q35: 算一下模型训练和推理时候显存占用,算一下kv cache的显存占用

【核心解析】 训练显存占用:模型参数、梯度、优化器状态(如Adam的m和v)、中间激活值;推理显存占用:模型参数、KV Cache、中间激活(通常比训练少);KV Cache显存计算:2 * batch_size * num_layers * seq_length * hidden_size * dtype_size;影响因素:序列长度、批次大小、模型维度、量化精度;显存优化技术:梯度检查点、混合精度训练、FlashAttention、KV Cache量化


Q36: 讲一下 FlashAttention 的原理

【核心解析】 FlashAttention 通过分块计算和在线 softmax 避免完整注意力矩阵的显存读写;利用 GPU 内存层次(SRAM vs HBM)减少 I/O 瓶颈;重计算策略在反向传播中节省显存;长序列场景下的显存和速度优势;与传统注意力机制的对比


Q37: 为什么 RMSNorm 在大模型里比 LayerNorm 更常见?

【核心解析】 RMSNorm 去除了均值中心化,仅保留方差缩放,计算量更小;在大模型中稳定性足够,且能减少训练和推理的工程开销;相比 LayerNorm 减少了同步和计算步骤,更利于分布式训练;工程上倾向于选择效率更高且效果相近的方法


Q38: 线程池核心参数

【核心解析】 核心线程数、最大线程数、空闲存活时间、工作队列类型与容量;拒绝策略;参数配置对性能的影响


Q39: 线程池自动回收原理

【核心解析】 线程池中线程的生命周期管理;空闲线程的回收机制(如allowCoreThreadTimeOut);线程销毁的条件与时机;与JVM垃圾回收的关系


Q40: 用线程池做了哪些实践

【核心解析】 异步任务处理;并发控制与资源隔离;批量任务执行优化;线程池监控与动态调整


Q41: 介绍一下事务

【核心解析】 事务的ACID特性;事务的隔离级别;事务的传播行为;分布式事务的解决方案


Q42: 事务隔离级别

【核心解析】 读未提交、读已提交、可重复读、串行化;各级别解决的并发问题(脏读、不可重复读、幻读);MVCC实现原理;隔离级别与性能的权衡


Q43: 手撕算法:车队问题。

【核心解析】 理解问题:多辆车在不同位置、不同速度,计算最终车队数量;通常使用单调栈或排序后遍历;时间复杂度 O(n log n) 或 O(n);注意处理追上后合并车队的逻辑


Q44: 手撕第k大的数,用堆实现,并讲解快排思路

【核心解析】 堆解法:维护大小为k的小顶堆,遍历数组,堆满时若当前元素大于堆顶则替换并调整,最终堆顶即为第k大,时间复杂度O(nlogk);快排思路:基于快速选择算法,每次partition确定一个元素的位置,若该位置正好是n-k则找到,否则递归左侧或右侧,平均O(n);两种方法对比:堆适合k较小且数据流场景,快排适合k任意且可修改原数组;边界处理:k的有效性、重复元素、数组长度等


Q45: 手撕:二叉树的前序遍历(需要自己建树)

【核心解析】 前序遍历顺序:根-左-右;递归实现简洁,迭代实现需用栈模拟;需自行定义树节点类并构建示例树;考察编码规范、边界处理(如空树);可讨论时间/空间复杂度。


Q46: 手撕:MHA rand7实现rand10

【核心解析】 多头注意力机制(MHA)原理;随机数生成算法;利用rand7均匀生成rand10的方法(拒绝采样、扩展区间)


Q47: 请介绍一下智能指针。

【核心解析】 智能指针的概念与作用;unique_ptr、shared_ptr、weak_ptr的区别与使用场景;智能指针的内存管理原理(RAII);循环引用问题及解决方案


Q48: UDP 为什么是不可靠的?

【核心解析】 无连接,不建立端到端连接;不保证数据包顺序到达;不进行拥塞控制和重传机制;校验和可选,不保证数据完整性;适用于实时性要求高、容忍丢包的场景


Q49: 你了解反向传播算法吗?能否手推反向传播过程?

【核心解析】 反向传播在神经网络训练中的作用;链式法则与梯度计算;前向传播与反向传播的数学推导;激活函数梯度与权重更新;手推示例与常见误区


Q50: MySQL索引

【核心解析】 索引的数据结构(B+树、哈希);索引类型(主键索引、唯一索引、普通索引、联合索引);索引的优缺点及使用场景;索引失效的常见情况;覆盖索引与回表


Q51: MySQL事务,项目中哪里需要关注事务

【核心解析】 事务的ACID特性;事务隔离级别及其解决的问题(脏读、不可重复读、幻读);实际项目中需要保证数据一致性的场景(如转账、下单扣库存);事务的传播行为;分布式事务的挑战


Q52: 软件工程中SOLID原则

【核心解析】 单一职责原则(SRP);开闭原则(OCP);里氏替换原则(LSP);接口隔离原则(ISP);依赖倒置原则(DIP)


Q53: TCP和UDP的区别

【核心解析】 TCP面向连接,UDP无连接;TCP提供可靠传输,UDP尽最大努力交付;TCP有流量控制和拥塞控制,UDP没有;TCP开销大,UDP开销小;适用场景(TCP用于文件传输、HTTP等,UDP用于实时音视频、DNS等)


Q54: HashMap底层有了解吗

【核心解析】 JDK 1.8前后数据结构变化(数组+链表/红黑树);哈希冲突解决方法(链地址法);扩容机制(负载因子、rehash);put和get操作流程;线程安全问题


Q55: 无重复字符的最长子串

【核心解析】 滑动窗口算法思想;使用哈希集合或哈希表记录字符出现位置;时间复杂度O(n);处理边界情况(空字符串、所有字符相同);优化点(跳跃式移动左指针)


Q56: MySQL事务隔离级别有哪些

【核心解析】 读未提交(Read Uncommitted);读已提交(Read Committed);可重复读(Repeatable Read);串行化(Serializable);各隔离级别解决的问题及实现方式(MVCC、锁)


Q57: 极大似然估计和最大后验概率有什么不同?

【核心解析】 极大似然估计(MLE)最大化 P(D|θ),仅考虑数据似然;最大后验(MAP)最大化 P(θ|D) ∝ P(D|θ)P(θ),引入先验;MLE 是无偏估计但可能过拟合,MAP 通过先验正则化;当先验为均匀分布时,MAP 退化为 MLE;MAP 在小样本下更稳定,MLE 在大样本下渐近等价。


Q58: 精排模型最终 rank 分怎么得到?

【核心解析】 精排模型通常输出点击率/转化率预估,如 pCTR、pCVR;最终 rank 分可能是多目标融合,如 eCPM = bid × pCTR × pCVR;融合方式包括加权求和、乘法、或使用排序学习模型;考虑业务规则和多样性调整;线上 serving 时需高效计算。


Q59: 代码题:买卖股票的最佳时机(I 和 II)

【核心解析】 I 只能买卖一次,求最大利润:遍历价格,记录最低价和最大利润;II 可多次买卖,求最大利润:贪心累加所有正差价;或动态规划,状态包括持有和未持有;时间复杂度 O(n),空间 O(1);考察数组遍历和贪心/DP 思想。


Q60: MySQL 联合索引什么时候会看起来“命中了”,但执行计划仍然很差?

【核心解析】 使用了联合索引前缀但后续过滤、排序或回表成本高;索引选择性差导致大量回表;排序无法利用索引产生 filesort;覆盖索引失效需访问行数据


Q61: MySQL 索引为什么底层一般选 B+ 树而不是红黑树、哈希表或者跳表?

【核心解析】 B+ 树分支因子高、树高低,减少随机 IO;叶子节点形成有序链表支持范围查询;对磁盘页缓存友好,适合块读取;哈希表不支持范围查询,红黑树深度大导致 IO 多;跳表在磁盘存储下效率不如 B+ 树


Q62: 手写令牌桶算法

【核心解析】 理解令牌桶算法的原理(固定速率生成令牌,突发流量处理);能够用代码实现令牌桶的基本逻辑(如使用定时器或惰性计算);考虑并发场景下的线程安全(如使用原子变量或锁);分析令牌桶与漏桶算法的区别及适用场景


Q63: sychronized和volatile的区别及原理

【核心解析】 synchronized保证原子性和可见性,volatile仅保证可见性和禁止指令重排;synchronized基于Monitor对象,volatile基于内存屏障;synchronized可修饰方法或代码块,volatile仅修饰变量;两者在性能和使用场景上的差异


Q64: Java中锁升级的过程

【核心解析】 偏向锁、轻量级锁、重量级锁的升级路径;偏向锁的撤销条件;轻量级锁通过CAS自旋尝试获取;重量级锁依赖操作系统互斥量;锁升级是单向的,不可降级


Q65: HashMap和ConcurrentHashMap的底层实现

【核心解析】 HashMap基于数组+链表/红黑树,非线程安全;ConcurrentHashMap在JDK1.8中使用CAS+synchronized实现分段锁;put、get操作的流程;扩容机制与并发扩容的处理;size()方法的实现差异


Q66: 手撕之字形(Zigzag)打印二叉树

【核心解析】 使用双栈或队列实现层序遍历;根据层数奇偶决定打印顺序;处理空节点和边界条件;时间/空间复杂度分析;代码的鲁棒性和可读性


Q67: 快排实现复杂度是多少?最坏、最好、平均情况分别是什么?

【核心解析】 快速排序的基本原理与分区操作;最好情况时间复杂度O(n log n)及发生条件(每次分区均匀);平均情况时间复杂度O(n log n);最坏情况时间复杂度O(n²)及发生条件(如已排序数组且基准选择不当);空间复杂度分析(递归栈深度)


Q68: C++ 的内存分区是什么样的?

【核心解析】 栈区:存放局部变量、函数参数,由编译器自动管理;堆区:动态分配内存,由程序员手动管理(new/delete);全局/静态区:存放全局变量和静态变量,程序结束时释放;常量区:存放常量字符串等,只读;代码区:存放程序二进制代码


Q69: 虚函数的底层实现原理是什么?除了虚函数表还有什么东西?

【核心解析】 虚函数表(vtable):每个包含虚函数的类有一个虚函数表,存储虚函数地址;虚指针(vptr):每个对象包含一个指向虚函数表的指针;多态调用过程:通过vptr找到vtable,再索引到具体函数;RTTI信息:虚函数表通常还关联type_info,用于运行时类型识别;虚继承中的虚基类表(vbtable)解决菱形继承问题


Q70: 在一个类的构造函数和析构函数里面执行其他类的虚函数会有什么问题?

【核心解析】 构造函数中调用虚函数:此时对象未完全构造,虚函数表指向当前类的版本,不会触发多态;析构函数中调用虚函数:派生类部分已销毁,虚函数表已更新为当前类,同样不会多态;可能导致未定义行为或逻辑错误;建议在构造/析构中避免调用虚函数,或明确调用非虚版本


Q71: 请描述Transformer模型的基本结构。

【核心解析】 自注意力机制(Scaled Dot-Product Attention);多头注意力(Multi-Head Attention);位置编码(Positional Encoding);前馈网络(Feed-Forward Network);残差连接与层归一化;编码器-解码器结构


Q72: RMSNorm和LayerNorm的区别是什么?

【核心解析】 LayerNorm的计算公式:减均值除标准差,再缩放平移;RMSNorm仅使用均方根进行缩放,去除了均值中心化;RMSNorm计算效率更高,性能相当;两者在Transformer中的应用位置


Q73: MoE(混合专家)模型中的路由机制是怎样的?

【核心解析】 MoE的基本结构:多个专家网络和一个门控网络;门控网络如何计算路由权重(如softmax);Top-k路由选择机制;路由的训练方式,包括负载均衡损失;路由崩塌问题及解决方案(如辅助损失、专家容量限制)


Q74: 请描述Attention机制的计算过程。

【核心解析】 Query、Key、Value的线性变换;计算注意力分数(QK^T/√d_k);Softmax归一化得到注意力权重;加权求和Value;多头注意力的并行计算


Q75: 多头注意力和普通注意力的区别是什么?头之间是否有交互?

【核心解析】 多头注意力将Q、K、V投影到多个子空间并行计算;每个头关注不同表示子空间;头之间通常没有直接交互,输出拼接后线性变换;多头增强了模型容量和表达能力


Q76: 多头注意力的头数会影响参数量和计算量吗?

【核心解析】 头数增加不改变总参数量(总维度不变时);计算量基本不变,但并行度增加;头数过少可能限制表达能力,过多可能导致冗余;实际选择需权衡效果与效率


Q77: 为什么现在主流大模型大多采用Decoder-only架构?

【核心解析】 Decoder-only的自回归生成方式适合语言建模;训练效率高,单向注意力可并行;上下文利用充分,支持灵活的提示工程;相比Encoder-Decoder,结构更简单,扩展性好


Q78: 在多轮对话场景下,Encoder-Decoder和Decoder-only架构有什么区别?

【核心解析】 Encoder-Decoder需要对输入全文编码,Decoder-only将历史对话拼接为前缀;Decoder-only更自然处理长对话,KV Cache可复用;Encoder-Decoder可能更适合需要深度理解输入的任务;效率与实现复杂度的权衡


Q79: 除了KV Cache,还有哪些推理优化手段?

【核心解析】 KV Cache的原理与内存占用;其他优化:模型量化、剪枝、蒸馏;FlashAttention等高效注意力实现;推测解码(Speculative Decoding);批处理与并行解码


Q80: 控制模型输出确定性的参数有哪些?Temperature、Top-k、Top-p分别是什么?

【核心解析】 Temperature应用于Softmax前,调节概率分布平滑度;Top-k采样:仅保留概率最高的k个token;Top-p(核采样):累积概率超过p的最小token集合;这些参数在解码阶段的作用与位置


Q81: JVM调优时,如何查看内存对象的情况?

【核心解析】 jmap 导出堆转储文件;jstat 监控内存各区使用率;MAT 或 JProfiler 分析对象引用链;GC 日志分析对象分配与回收;堆直方图查看类实例数量与大小


Q82: 你说的算子强度的定义是什么?归一化怎么做的?信号的意义是什么?

【核心解析】 算子强度衡量计算与访存之比;归一化用于消除量纲影响或稳定训练;信号在系统中代表信息传递与特征表示;可能涉及深度学习中的计算优化。


Q83: 特征重要度你知道有哪些方式?其他的专门做因果推断去找特征重要度的方式有哪些?

【核心解析】 基于模型的特征重要度如随机森林的 impurity 或 permutation importance;SHAP 和 LIME 等解释性方法;因果推断中的特征重要度如 IV、PSM、双重稳健估计;do-calculus 与反事实推理;区别在于关联与因果。


Q84: DIN 的激活函数使用了什么?作用是什么?

【核心解析】 DIN 使用 Dice 激活函数;Dice 是 PReLU 的变体,根据数据分布自适应调整激活阈值;缓解稀疏特征带来的梯度消失问题;提升模型对用户兴趣的捕捉能力。


Q85: 手撕快排

【核心解析】 快速排序的分治思想;基准元素的选择策略;分区过程与原地排序实现;时间复杂度分析(平均O(nlogn),最坏O(n^2));空间复杂度与递归栈深度


Q86: TCP和UDP的区别

【核心解析】 TCP面向连接、可靠传输,UDP无连接、尽力而为;TCP通过序列号、确认应答、重传机制保证可靠性;UDP头部开销小,传输效率高;TCP有流量控制和拥塞控制,UDP无;适用场景:TCP用于文件传输、HTTP等,UDP用于视频直播、DNS等


Q87: 特征重要度你知道有哪些方式?以及专门做因果推断去找特征重要度的方式。

【核心解析】 特征重要度的传统方法(如树模型的特征重要性、排列重要性、SHAP 值);因果推断的基本概念(干预、反事实);因果特征选择方法(如基于因果图、IV、DML);在 Agent 决策可解释性中的应用。


Q88: 如何理解将 FP16 权重量化为 INT8+FP32 scaling 的量化过程?

【核心解析】 量化是将浮点值映射到低比特整数范围;scaling factor 通常基于绝对值最大值计算,将 FP16 范围对齐到 INT8 范围([-127, 127] 或 [-128, 127]);反量化时用 scaling factor 恢复近似浮点值;理解量化误差来源和对称/非对称量化区别。


Q89: 手写一个简单的 CUDA vector add kernel,并解释其中边界判断、block 大小与 warp 的关系等基础概念。

【核心解析】 实现向量加法的 CUDA kernel,包含边界判断 if (id < n) 防止越界;理解 grid、block、thread 的层次组织;block 大小通常设为 warp 大小(32)的倍数以充分利用硬件;warp 是调度和执行的基本单位;无需 shared memory 因为无数据复用。


Q90: 请解释数据库事务的ACID特性。

【核心解析】 原子性(Atomicity):事务要么全部执行,要么全部不执行;一致性(Consistency):事务执行前后,数据库都处于一致状态;隔离性(Isolation):并发事务之间互不干扰;持久性(Durability):事务提交后,其结果是永久的。


Q91: MySQL数据库的隔离级别有哪些?分别解决了什么问题?

【核心解析】 读未提交(Read Uncommitted):最低级别,可能脏读;读已提交(Read Committed):解决脏读,但可能不可重复读;可重复读(Repeatable Read):解决不可重复读,但可能幻读(InnoDB通过间隙锁部分解决);串行化(Serializable):最高级别,解决幻读,但并发性能差。


Q92: 手撕代码:用Numpy实现线性回归,并使用梯度下降进行训练

【核心解析】 线性回归的数学原理与损失函数(均方误差);梯度下降的推导与实现;Numpy的矩阵运算与向量化;模型参数更新与收敛判断


Q93: 你觉得GAN的损失函数和普通模型的损失函数有什么本质区别?相比SRGAN,它在损失函数上做了哪些改进?

【核心解析】 GAN的对抗损失原理(生成器与判别器的博弈);与传统损失(如MSE)的区别:关注分布相似性而非逐像素差异;SRGAN引入感知损失(内容损失+对抗损失);感知损失使用VGG特征图,提升视觉质量


Q94: 手撕代码:动态规划

【核心解析】 理解动态规划的核心思想:最优子结构和重叠子问题;能够推导状态定义和状态转移方程;掌握自顶向下(记忆化搜索)和自底向上(递推)两种实现方式;分析时间与空间复杂度,并考虑优化(如滚动数组)。


Q95: 说一下AQS(AbstractQueuedSynchronizer)的原理?

【核心解析】 AQS是Java并发包的基础框架,基于FIFO等待队列;通过state变量表示同步状态,使用CAS操作修改;独占模式(如ReentrantLock)和共享模式(如Semaphore)的实现;线程阻塞与唤醒机制(LockSupport);条件队列(ConditionObject)实现等待/通知。


Q96: 传统NLP做分类场景训练的时候,最后的损失函数一般是什么

【核心解析】 交叉熵损失函数(Cross-Entropy Loss)是最常用的分类损失函数;对于二分类问题,通常使用二元交叉熵(Binary Cross-Entropy);对于多分类问题,使用分类交叉熵(Categorical Cross-Entropy),通常与softmax激活函数配合使用;损失函数衡量模型预测概率分布与真实标签分布之间的差异


Q97: 评估指标中的召回率(Recall)是怎么计算的

【核心解析】 召回率 = TP / (TP + FN),即正确预测的正样本数占所有实际正样本数的比例;关注模型对正样本的覆盖能力;与精确率(Precision)共同使用,F1分数是两者的调和平均;在信息检索、异常检测等场景中尤为重要


Q98: 手撕代码:长度最小的子数组(LeetCode 209)。

【核心解析】 滑动窗口或前缀和+二分查找;滑动窗口维护左右指针,动态调整窗口和;时间复杂度O(n),空间O(1);注意边界条件如数组全为正整数。


Q99: 请解释C++中左值与右值的概念及区别。

【核心解析】 左值有持久内存地址,可出现在赋值左侧;右值是临时对象,无持久地址;C++11引入右值引用实现移动语义;std::move可将左值转为右值;理解值类别对优化和资源管理至关重要。


Q100: 手撕代码:二叉树的遍历

【核心解析】 前序、中序、后序遍历的递归与非递归实现;层序遍历(BFS)使用队列;Morris遍历实现O(1)空间复杂度;理解遍历顺序与栈/队列的配合;时间复杂度O(n),空间复杂度最坏O(n)。