标签题目
算法相关面试题第 2 页
对句法分析、词性标注的算法有了解吗?
这道题考察两类自然语言处理基础任务:词性标注负责给词分配语法类别,句法分析负责刻画词与词、短语与短语之间的结构关系。好的回答应分别说明任务定义、经典方法、主流神经模型、评价指标和工程取舍,再解释二者如何在完整 NLP 系统中相互影响。
分词算法有哪些?
分词算法解决的是把连续文本切成有意义的词或子词单位。中文没有天然空格,因此分词既要处理词典匹配,也要处理歧义、未登录词、新词、专名、领域词和下游任务适配。常见算法包括基于词典的正向/逆向/双向最大匹配、DAG 加动态规划、HMM/CRF 序列标注、统计语言模型、深度学习序列标注,以及 BPE、WordPiece、SentencePiece 等子词切分方法。
同题还出现在 2 个公司岗位
栈溢出一般抛什么异常?
栈溢出在 Java 中一般抛出 java.lang.StackOverflowError。严格说它不是 Exception,而是 Error,表示某个线程的调用栈空间被耗尽,常见原因是递归过深、递归没有终止条件、方法之间循环调用,或者单个栈帧过大。
CAN降低的是计算复杂度还是存储复杂度?
这里的 CAN 按推荐和 CTR 建模语境理解为 Co-Action Network。它的核心不是把线上推理的所有计算量都变少,而是把显式二阶或高阶交叉带来的参数量、存储量和稀疏组合记忆压力降下来。它通过让一个特征参与生成或选择作用于另一个特征的交互权重,用参数共享和动态交互替代海量离散交叉参数,因此主要回答应落在存储复杂度、参数复杂度和长尾稀疏性上,同时承认会引入一定运行时计算。
推荐系统的召回、排序和重排链路如何理解?
这道题考察候选人是否能从工程链路而不是单点模型理解推荐系统:召回负责从海量候选中高覆盖地捞出可能感兴趣的内容,排序负责用特征和模型估计用户行为价值,重排负责在最终曝光前加入多样性、新鲜度、去重、业务规则和体验约束,同时还要兼顾在线延迟、离线评估和 A/B 实验闭环。
同题还出现在 1 个公司岗位
StringBuffer的底层数据结构?
StringBuffer 的底层核心是一个可变的连续缓冲区,而不是每次修改都创建新的 String。常见实现中,真正负责存储、长度、容量和扩容的是 AbstractStringBuilder;早期实现可理解为 char[],JDK 9+ 常见实现为了紧凑字符串改为 byte[] 加 coder 标记,但对外仍表现为可变字符序列。StringBuffer 的特点是在这套可变缓冲区能力之上,用 synchronized 保护关键操作,因此适合多个线程共享同一个实例时使用;单线程场景通常优先 StringBuilder。
对哪些分类算法有研究?
这道题考察的不是背诵分类算法列表,而是候选人能否把分类问题的建模假设、算法家族、适用场景、优缺点、评估方法和工程选择讲清楚。高质量回答应围绕线性模型、树模型与集成方法、核方法、概率模型、神经分类器、文本/NLP分类器以及评估和选型逻辑展开,并能结合特征稀疏性、样本规模、类别不均衡、可解释性、线上延迟等因素说明取舍。
TopK,如果k很小,n很大,用什么方法?
当 k 很小、n 很大时,TopK 的标准精确解通常是维护大小为 k 的堆,而不是全排序。求最大 TopK 用小顶堆,求最小 TopK 用大顶堆,复杂度 O(n log k)、空间 O(k)。如果数据可放入内存且允许原地修改,可以补充 quickselect;如果值域小、数据海量或允许近似,还要分别考虑计数桶、分片合并和近似频率算法。
堆上的元素满了会发生什么?
JVM 堆满通常指堆内存中可用于对象分配的空间不足。对象分配失败后,虚拟机会先尝试触发 Young GC 或 Full GC 回收空间;如果回收后仍无法满足分配,或者老年代晋升失败、连续 GC 效率过低,就可能抛出 OutOfMemoryError。回答时要围绕对象分配、GC 尝试、晋升失败、OOM 类型、排查与预防展开,不要误讲成优先队列里的堆元素满了。
用zk做注册中心,那zk数据结构是怎样的?
ZooKeeper 做注册中心时,核心数据结构不是表或哈希,而是一个层级命名空间的 znode 树。每个服务、分组、版本和实例都可以映射成路径节点,服务实例通常用临时节点或临时顺序节点表示。客户端通过 watch 订阅子节点变化,实例会话失效后节点自动删除,从而实现服务发现与上下线通知。
数组和链表有什么区别?
数组和链表都是线性表,但底层组织方式不同:数组用连续内存存放元素,链表用离散节点通过引用连接。这个差异决定了数组随机访问快、缓存友好,但插入删除和扩容成本可能高;链表插入删除在已定位节点时很快,但查找慢、缓存局部性差、额外指针开销大。工程上不能只背复杂度,要说明复杂度成立的前提,并结合 Java 的 ArrayList 和 LinkedList 对照。
同题还出现在 1 个公司岗位
红黑树和平衡二叉树的区别?
红黑树和平衡二叉树都是为了避免普通二叉搜索树退化成链表而设计的自平衡二叉搜索树,核心区别在于平衡标准和维护成本。面试中说的平衡二叉树通常特指 AVL 树:它要求每个节点左右子树高度差最多为 1,平衡非常严格,所以查询路径更短;红黑树用颜色规则约束黑色节点数量和红色节点相邻关系,允许一定程度的不完全平衡,因此插入、删除时旋转和调整更少,更适合频繁更新的工程场景。
说一下数据库底层数据结构B+数据,为什么用,与二叉平衡树区别 Redis怎么用的?
数据库索引常用 B+ 树,核心原因不是“查找复杂度看起来是 O(log n)”,而是它非常适合磁盘和页式存储:节点扇出高,树高低,单次查询需要的页访问次数少;叶子节点按键有序并通过链表连接,范围查询、排序扫描、分页扫描都很高效。二叉平衡树如 AVL、红黑树更适合内存中的动态查找结构,节点扇出低、树高大、局部性差,如果直接用于磁盘索引会产生大量随机 I/O。
MySQL 底层数据结构?
MySQL 底层数据结构在 InnoDB 中主要围绕“页、B+树索引、聚簇索引、二级索引、Buffer Pool、事务日志”展开。真正决定查询性能的不是某一个抽象结构,而是这些结构如何协同:数据按页组织,索引以 B+树维护有序访问路径,主键索引叶子节点保存完整行记录,二级索引叶子节点保存主键值,内存中的 Buffer Pool 缓存热点页,变更再通过 redo log、undo log 等机制保证事务与崩溃恢复。理解这些内容,才能解释为什么 MySQL 不直接使用普通二叉树、红黑树或单纯哈希表作为主要索引结构。
JVM中的【堆】是用什么数据结构来实现的?
JVM 中的堆不是二叉堆、最大堆、最小堆这种数据结构,而是 JVM 运行时用于存放对象实例和数组的一块共享内存区域。它的具体组织方式取决于垃圾收集器:可能按年轻代、老年代划分,也可能按 Region 管理;对象分配通常依赖 TLAB、指针碰撞、空闲列表等机制,而对象回收依赖可达性分析和 GC 元数据。
java中有哪些以队列、链表为底层实现的数据结构?
Java 里要区分“队列接口”和“链表底层”。Queue、Deque 是行为抽象,表示先进先出、双端队列或优先级访问;LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue 这类才是链式节点结构。ArrayDeque、ArrayBlockingQueue、PriorityQueue 虽然暴露队列接口,但底层分别是循环数组、有界数组和二叉堆数组,不是链表。LinkedHashMap 则是哈希表加双向链表,用链表维护插入顺序或访问顺序,但它本身不实现 Queue。
消息队列如何保证消息不丢失?
消息队列不丢失不能只回答“开持久化、开确认、消费后再 ack”。更好的回答是把消息链路拆成 producer、broker、consumer 三段,逐段说明消息丢失产生的位置、对应可靠性机制、机制代价,以及至少一次、至多一次、恰好一次之间的取舍。
一个单向链表,奇数节点是升序、偶数节点是降序,怎么样将链表转变成降序的链表?
这道题的关键不是排序整个链表,而是利用题目已经给出的局部有序性:按位置拆出奇数位链表和偶数位链表。奇数位本身升序,反转后变成降序;偶数位本身已经降序;最后对两条降序链表做一次归并即可。
如何在大文件中找出出现频率最高的前100个内容?
大文件中找出现频率最高的前 100 个内容,本质是大数据 TopK 频次统计:先统计每个内容出现次数,再从频次结果中选 Top100。答案要根据内存是否能容纳全部去重内容,选择 HashMap 计数、小根堆、哈希切分、外部排序、分布式聚合或流式近似算法。
推荐系统工程上是怎么实现的?
推荐系统工程实现通常是召回、粗排、精排、重排、策略和反馈闭环的多阶段链路。面试中要讲清离线训练、实时特征、在线服务、实验平台和监控回流,而不是只列几个推荐算法名字。
OpenCV里边缘检测怎么做的?
OpenCV 边缘检测常见流程是灰度化、去噪、计算梯度、非极大值抑制和阈值连接。面试中可以重点讲 Canny,也可以补充 Sobel、Scharr、Laplacian 等算子分别适合检测一阶或二阶变化。
GBDT 的实现流程是什么?
GBDT 的实现流程是不断训练回归树去拟合当前模型的负梯度或残差,并把新树按学习率累加到集成模型中。回答时要讲清初始化、计算伪残差、建树、叶子权重、模型更新和停止条件。
给定一个未排序数组,如何输出第K大的数字?
未排序数组找第 K 大,常见解法有排序、大小为 K 的小顶堆和 Quickselect。面试中最推荐先给出复杂度对比,再重点讲 Quickselect 的 partition 思路和边界处理。
Python 的生成器是如何实现的?
Python 生成器的本质是带有可暂停执行状态的迭代器。回答要讲清 yield 如何保存栈帧、next/send 如何恢复执行,以及它和普通函数、迭代器的关系。
基于值函数和基于策略梯度的 RL 算法有什么区别,分别适合什么场景?
基于值函数和基于策略梯度的 RL 方法区别在于前者学习状态或动作价值再间接选动作,后者直接优化参数化策略。
如何合并 N 个有序数组并输出有序数组?
合并 N 个有序数组的经典做法是使用小顶堆维护每个数组当前最小元素,复杂度 O(M log N),其中 M 是总元素数。
常用的召回算法有哪些?
常用召回算法可以按规则、协同过滤、内容向量、模型向量、图关系和实时行为分组,核心目标是在可控延迟内从海量物料中取到足够好的候选。
如何实现 NMS 的全过程,包括按 score 排序?
NMS 的流程是按置信度排序,依次保留最高分框,计算它与剩余框的 IoU,并删除重叠过高的候选框,直到候选框处理完。
什么是随机森林?
随机森林是用多棵决策树做 Bagging 集成的方法,通过样本随机和特征随机降低单棵树的方差,最终用投票或平均得到更稳的预测。
遗传算法优化和梯度下降优化有什么区别?
遗传算法和梯度下降的区别在于优化信息、搜索方式和适用问题不同:前者是群体式全局启发搜索,后者依赖梯度做连续参数局部迭代。
只能买卖一次时,如何计算股票最大收益?
一次买卖股票最大收益的核心是维护历史最低买入价,并在每一天尝试把当天价格作为卖出价更新最大利润。
给定整数数组,如何求和为 m 且长度最短的子数组长度?
求和为 m 的最短连续子数组要先确认数组元素是否都为正,正数数组可用滑动窗口,含负数时要改用前缀和和哈希结构。
如何求字符串的最长重复子串长度?
最长重复子串可以从暴力比较、后缀数组、后缀自动机或二分长度加哈希回答,面试中重点讲清重复子串和复杂度取舍。
如何实现洗牌算法?
公平洗牌应使用 Fisher-Yates 算法,从后往前随机选择一个未固定位置交换,保证每种排列出现概率相同。
哈希冲突中,伪随机开放地址法如何插入和查找元素?
伪随机开放地址法用同一个哈希表数组解决冲突,通过可复现的探测序列寻找空位或目标元素,关键是插入和查找使用相同序列。
常见的加解密算法有哪些?
常见加解密算法要按对称加密、非对称加密、哈希摘要、消息认证和签名分类回答,并说明它们解决的问题不同。
Dijkstra 算法和 Prim 算法有什么区别?
Dijkstra 求单源最短路径,Prim 求最小生成树;两者都可用贪心和优先队列,但目标、状态含义和边权约束不同。
模型训练后需要保存哪些参数?
模型训练后的保存内容不只是权重文件,还包括结构、预处理、特征配置、归一化统计、优化器状态、版本信息和评估元数据。
如何用链表实现两个大数字相加?
链表大数相加要逐位处理两个链表和进位,核心是对齐位序、维护 carry,并在末尾补上最后的进位节点。
如何在给定字符串中输出出现频率最高的字母?
字符串最高频字母题的核心是一次遍历统计频次,再按题目规则处理并列、大小写、非字母字符和字符集范围。
分类问题常用的评价指标有哪些?
分类指标不是一串名词,而是一套围绕混淆矩阵、阈值、样本分布、排序质量、概率校准和业务损失的评价体系。
如何反转单链表?
反转单链表的标准做法是迭代维护 prev、curr、next 三个指针,逐个改变 next 指向,最后返回 prev。
决策树做分类和回归时有什么区别?
决策树做分类和回归时有什么区别?这道腾讯牛客题的关键是围绕“决策树分类与回归”讲清概念、机制、取舍和边界。分类树面向离散类别,常用信息增益、信息增益率或 Gini 指数选择划分;回归树面向连续值,常用平方误差、方差下降或 MAE 类目标选择切分。两者树结构相似,但叶子输出、损失度量和评估指标不同。
推荐系统中如何解决冷启动问题?
推荐系统中如何解决冷启动问题?这道腾讯牛客题的关键是围绕“推荐系统冷启动”讲清概念、机制、取舍和边界。推荐系统冷启动要先区分用户冷启动、物品冷启动和系统冷启动。用户没有行为时依赖注册画像、地理位置、设备、兴趣选择和热门兜底;物品没有交互时依赖内容特征、类目、文本/图像 embedding 和小流量探索;系统冷启动则要先靠规则、运营种子数据和快速反馈闭环建立初始样本。
GBDT 中的梯度提升如何理解?
GBDT 中的梯度提升如何理解?这道腾讯牛客题的关键是围绕“GBDT 梯度提升机制”讲清概念、机制、取舍和边界。GBDT 的梯度提升可以理解为在函数空间做梯度下降:当前模型 F_{m-1} 已经给出预测后,下一棵 CART 回归树 h_m 去拟合损失函数对当前预测的负梯度,也就是伪残差,最后按 F_m=F_{m-1}+eta*h_m 逐轮加到模型里。
高维稀疏特征为什么不适合直接用神经网络训练?
高维稀疏特征为什么不适合直接用神经网络训练?这道腾讯牛客题的关键是围绕“高维稀疏特征直接训练神经网络的风险”讲清概念、机制、取舍和边界。高维稀疏特征如果直接 one-hot 输入神经网络,会带来参数巨大、有效梯度稀疏、长尾类别训练不足、过拟合和线上存储/延迟成本。工程上通常先做 embedding、特征哈希、频次截断、交叉特征或用适合稀疏输入的线性/树模型做基线。
最大连续子数组和如何求解?
最大连续子数组和如何求解?这道腾讯牛客题的关键是围绕“最大连续子数组和 Kadane 动态规划”讲清概念、机制、取舍和边界。最大连续子数组和常用 Kadane 算法。定义 current 表示以当前位置结尾的最大连续和,best 表示全局最大值;遍历每个数时,current = max(x, current + x),再更新 best = max(best, current)。
模型过拟合应该如何处理?
模型过拟合应该如何处理?这道腾讯牛客题的关键是围绕“模型过拟合治理”讲清概念、机制、取舍和边界。过拟合是模型在训练集表现好、验证或线上表现差,说明模型记住了训练噪声、泄漏或过细模式。处理要先看训练/验证曲线,再定位容量、数据、正则和评估泄漏。