整理真实软件工程师面试题,可以按照公司、难度和关键词进行筛选。
Algorithms
给定两条按照时间戳严格递增排列的稀疏时间序列 `A` 和 `B`,其中每个数据点表示从该时间戳开始,该序列的当前值发生变化,并持续保持该值直到下一次变化。每个数据点的格式为 `[time, value]`。要求将两条时间序列按照时间顺序进行合并,并生成一条新的时间序列,使得每个时间点的输出值等于 `A` 和 `B` 在该时间点的当前有效值之和。如果某条序列在最小时间戳之前没有事件,则其初始值默认为 `0`。当某条序列已经处理完毕时,其最后一个状态仍然持续有效,因此另一条序列后续发生变化时,仍需要使用该最终状态计算合并值。输出结果需要去除冗余事件,只有当两条序列当前值之和相对于上一次输出真正发生变化时,才记录新的时间点。如果 `A` 和 `B` 在相同时间戳同时发生变化,则必须在该时间点同时更新两个序列的状态,并只产生一次合并结果,不能产生中间状态或重复时间点。两条输入序列长度分别为 `n` 和 `m`,时间戳均已按照递增顺序排列。
Object-Oriented Design
设计一个餐厅点餐与菜单定价系统。系统需要支持多种类型的菜单商品,其中 `Pizza` 是核心商品之一。 每个 `Pizza` 由一个 `Crust`、一个 `Size` 和 `0` 到 `N` 个 `Topping` 组成。`Crust` 具有名称和基础价格,`Size` 具有名称和价格倍率,`Topping` 具有名称和价格。 披萨价格按照以下公式计算:`Price = (base_price + sum(toppings_prices)) * size_multiplier`。 系统需要支持动态增加新的 `Size`,例如 `Small`、`Medium`、`Large`,以及未来新增的其他尺寸,而不应该修改核心价格计算逻辑。 系统还需要支持多种菜单商品类型,例如 `Pizza`、`Pasta` 等,并允许一个 `Order` 同时包含不同类型的 `MenuItem`。 当新增一种菜单商品类型时,不应该修改已有的订单计算逻辑。每种菜单商品应该能够独立计算自己的价格,并由 `Order` 统一计算所有商品的总价。 金额计算需要保证精度,同时需要对非法价格、非法尺寸倍率等输入进行校验。
Algorithms
给定一个整数数组 `nums` 和一个整数 `m`,初始时整个数组是一个连续子数组。每次操作可以选择当前长度大于 `1` 的连续子数组,并将其拆分成两个非空的连续子数组。一个子数组被认为是合法的,当且仅当它的长度等于 `1`,或者该子数组中所有元素的总和大于等于 `m`。要求判断是否可以通过一系列拆分操作,最终将整个数组拆分成长度全部为 `1` 的单元素子数组。如果可以完成完整拆分,则返回 `true`,否则返回 `false`。
Algorithms
给定一个表示数学表达式的字符串 `expression`,表达式由 `0` 到 `9` 的数字字符、对应的英文数字单词以及加法和减法运算符组成。数字可以使用数字字符表示,也可以使用对应的英文单词表示,例如 `0` 可以表示为 `0` 或 `zero`,`1` 可以表示为 `1` 或 `one`。表达式中的数字和运算符按照合法的数学表达式顺序排列,每两个数字之间只有一个操作符,支持的操作符只有 `+` 和 `-`。要求解析表达式并返回最终计算结果,如果输入为空、包含无法识别的数字或操作符,或者不符合规定的表达式格式,则返回 `None`。
Graph
给定一个图的数据结构,其中每个 `Vertex` 包含自己的 `data` 和一个 `neighbors` 列表,同时由 `Graph` 作为容器保存所有顶点。要求实现一个 `clone` 函数,对输入图进行完全独立的深拷贝,返回一个与原图结构和值相同、但所有顶点对象均为新创建对象的图副本。克隆后的图不能与原图共享任何 `Vertex` 对象或邻居列表,并且需要正确处理图中的环、重复边以及多个顶点指向同一个邻居的情况。
Intervals
给定两个已经按照区间起点排序、且各自内部不存在重叠区间的区间列表 `A` 和 `B`。每个区间由 `[start, end]` 表示,要求将两个列表中的所有区间合并成一个新的区间并集。如果两个区间存在重叠,则将它们合并成覆盖范围更大的单个区间;如果两个区间互不重叠,则分别保留。最终返回按照起点排序且不存在重叠的区间列表。
String Parsing
给定多个部门的员工薪资数据,每个员工的信息以字符串形式表示,格式类似 `"$190,000:Name:Position"`,其中包含员工薪资、姓名和职位。要求从这些字符串中解析出员工薪资,并计算所有员工薪资的中位数。输入中的每个部门薪资数据已经按照薪资从小到大排序。当只有两个部门时,需要利用两个有序数组的性质高效计算所有员工薪资的中位数;当部门数量扩展到三个或更多时,需要设计能够处理多个有序数据源的通用方案。
Machine Learning
给定特征矩阵 `X` 和二分类标签向量 `y`,其中 `X` 包含 `N` 个样本和 `d` 个连续特征,`y` 的取值为 `0` 或 `1`。要求建立一个参数化的二分类概率模型,根据输入特征预测样本属于类别 `1` 的概率,并从训练数据中估计模型参数。要求从数学原理出发解释模型假设、最大似然目标函数以及参数梯度,并使用基础矩阵运算手写模型训练和预测过程,不直接调用现成的机器学习库。
Array
给定一个整数数组 `nums` 和一个整数 `target`,请找到数组中两个不同位置的元素,使它们的和等于 `target`,并返回这两个元素对应的索引。假设每组输入只存在一个有效答案,并且同一个数组元素不能被重复使用。
String
给定一个字符串 `s`,重新排列其中的所有字符,使得结果字符串中任意两个相邻字符都不相同。如果存在满足条件的排列,则返回任意一个合法结果;如果不存在合法排列,则返回空字符串 `""`。字符串只包含小写英文字母。
Hash Table
设计一个电商用户浏览历史系统,用于记录用户最近浏览过的商品,并支持获取用户最近浏览的商品列表。系统需要支持重复浏览:当用户再次浏览已经存在于历史记录中的商品时,该商品应被更新为最近浏览记录;系统具有固定容量,当浏览记录超过容量时,需要删除最久未浏览的商品。系统还需要支持多个用户,并保证每个用户的浏览历史彼此独立。
Object-Oriented Design
设计一个披萨订购系统,系统需要表示不同的披萨、用户订单以及优惠券,并能够计算订单的 subtotal、discount 和最终 total。每个订单可以包含多个披萨,也可以使用多个优惠券。系统需要支持不同类型的优惠规则,例如百分比折扣、固定金额折扣和买一送一,并且在未来新增优惠券类型时不应该修改订单核心逻辑。
HashMap
给定一个聊天应用的日志流,每条日志表示一次用户发送消息的事件,包含 `timestamp`、`sender_username`、`receiver_username` 和 `message_text` 四个字段。要求设计一个 Log Stream Processor,支持 `RegisterEvent(timestamp, sender_username, receiver_username, message_text)` 注册新的消息事件,并支持 `GetMostActiveUser()` 返回当前拥有最多 active conversations 的用户。两个唯一用户之间无论交换多少条消息,都只计算为一个 conversation,因此同一对用户之间的重复消息不能重复增加 conversation 数量。当一条消息发生时,该 conversation 同时属于发送者和接收者双方。如果多个用户拥有相同数量的 active conversations,需要根据题目要求确定 tie-breaking rule。
Binary Tree
给定一棵二叉树,每个节点的值只能是 `0` 或 `1`。如果两个值为 `1` 的节点通过父子关系直接连接,则它们属于同一个 island;一个 island 可以由一个或多个连续的 `1` 节点组成,只有通过父子边连续连接的 `1` 节点才属于同一个 island。要求统计整棵二叉树中一共有多少个独立的 island。
DFS
给定一个绝对路径 `rootPath`,要求递归遍历该路径下的所有文件和文件夹,并根据文件内容判断哪些文件是重复文件。文件名、文件路径以及文件扩展名都不影响文件是否重复,只要两个或多个文件的实际内容完全相同,就应该被归入同一个重复文件组。需要实现文件系统遍历逻辑,并返回所有具有相同内容的文件分组。
Graph
给定多个货币之间的兑换汇率,将每种货币视为图中的一个节点,将一次货币兑换视为一条有向边。实现一个方法,根据起始货币 `source`、目标货币 `target` 和当前汇率信息,计算从 `source` 到 `target` 的兑换结果。系统可能存在多条合法兑换路径,因此需要明确最终目标是寻找任意可达路径、最少兑换次数,还是最终兑换金额最大的路径,并根据不同业务目标选择合适的算法。
System Design
设计一个面向约 500 万活跃用户的移动银行应用 Help Center Search System。用户可以通过自然语言输入问题,快速获得准确的帮助信息,例如银行卡被拒绝、密码重置、转账状态异常或 ATM 吞卡等问题。系统需要支持高并发读取、较低搜索延迟、持续更新 Help Center 内容,并尽可能通过自助搜索减少人工客服请求。进一步需要考虑多语言、语音输入、个性化搜索、搜索结果排序以及直接生成答案等能力。
Graph
给定一个二维迷宫 `maze`,其中空地使用空格字符 `' '` 表示,障碍物使用字符 `'X'` 表示。给定起点 `(startRow, startCol)` 和终点 `(endRow, endCol)`,每次可以向上、下、左、右四个方向移动一格,但不能进入障碍物或越过迷宫边界。要求返回从起点到终点所需要的最少移动步数。如果无法到达终点,则返回 `-1`。
System Design
设计一个面向高并发多租户 API 服务的分布式限流系统。系统需要根据 `userId`、`clientId`、`IP`、API `endpoint` 等维度配置不同的请求配额和限流规则,并针对每个请求返回 `Allow` 或 `Reject` 决策。系统需要支持百万级甚至更高的请求吞吐,同时保证低延迟、高可用,并避免多个服务实例并发处理同一个限流维度时出现配额超发。对于被拒绝的请求,需要能够返回 HTTP `429 Too Many Requests` 以及合理的 `Retry-After` 信息。
Binary Tree
给定一棵二叉树 `root`,要求遍历整棵树,并将每个节点的原始值 `val` 原地更新为以该节点为根的整棵子树中所有节点值之和,其中包括节点自身。随后将问题扩展到多棵二叉树:给定包含 `k` 棵二叉树根节点的数组 `trees`,不同树的拓扑结构可能不同,需要按照对应位置合并这些树,将相同位置的节点值进行累加,生成一棵新的二叉树,并进一步将合并后的每个节点更新为对应子树的节点总和。需要正确处理空树、左右子树结构不对称以及高度未知甚至退化成单链表的情况。
System Design
设计一个类似 Dropbox 的大规模云文件同步与存储系统,支持数千万至数亿设备端用户在桌面端、移动端和 Web 端之间进行实时双向文件同步。系统需要支持大文件上传下载、断点续传、文件版本管理、文件与文件夹共享、增量块级同步、内容去重、多设备实时变更通知以及跨区域高可用容灾,同时需要在高并发场景下控制元数据一致性、网络带宽和对象存储成本。系统应将文件元数据与实际文件内容解耦,并能够随着用户规模和每日文件变更量增长进行水平扩展。
String Parsing
设计并实现一个玩具编程语言的基础解释器。输入是一个按照执行顺序排列的字符串指令列表,解释器维护一个初始值为 `0` 的整型寄存器 `x`,支持 `ADD n` 将 `n` 加到 `x` 上,支持 `MULTIPLY n` 将 `x` 乘以 `n`,支持通过 `DEF fname` 和 `END` 定义函数,并通过 `EXEC fname` 执行已经完整定义的函数。函数定义阶段的指令不能立即执行,而应该暂存到函数符号表中,只有遇到对应的 `EXEC` 时才真正执行函数体。函数内部还可以调用其他已经定义的函数,因此需要正确处理递归执行、未定义函数以及潜在的循环调用。
Probability
设计并实现一个任务优先级调度器。系统维护一个任务池,每个任务对应一个正整数权重,需要支持批量添加任务的 `addTasks(tasks, weights)` 和按权重随机抽取任务的 `popTasks(count)`。调用 `popTasks(count)` 时,需要按照任务当前权重占总权重的比例随机选择指定数量的任务,并且每个任务一旦被选中就必须立即从任务池中移除,使后续抽取基于剩余任务和剩余总权重重新计算概率。任务池中的任务顺序不要求保持不变,因此可以利用这一条件优化删除操作。系统还需要正确处理空任务池、非法权重、数量越界以及总权重可能溢出的情况。
Array
给定一个整数数组 `nums`,要求返回一个数组 `result`,其中 `result[i]` 表示 `nums` 中除 `nums[i]` 之外所有元素的乘积。不能使用除法,并要求算法的时间复杂度为 O(n),额外空间复杂度为 O(1),其中返回结果数组本身不计入额外空间。数组中的元素可能包含 `0` 和负数,因此需要正确处理这些情况。
Hash Map
给定一个点赞事件列表 `events`,每个事件包含用户 ID `userId` 和内容 ID `contentId`。要求统计每个内容获得的点赞数量,并返回当前点赞数量最多的 `contentId`。 如果多个内容的点赞数量相同,则必须按照确定性的平局规则返回结果。本题采用字典序最小的 `contentId` 作为平局时的返回值。 点赞事件中的 `contentId` 使用字符串表示。默认每一条事件都代表一次有效点赞,因此重复事件也会被分别计数。若业务要求每个用户对同一内容只能贡献一次点赞,则需要额外进行 `(userId, contentId)` 级别的去重。 当 `events` 为空、`null`,或没有任何有效内容 ID 时,返回 `null`。
Stack
给定一个只包含字符 `(`、`)`、`[`、`]`、`{`、`}` 的字符串 `s`,判断字符串中的括号是否有效。 括号字符串有效需要满足: 1. 每一个左括号都必须由相同类型的右括号闭合。 2. 右括号必须按照正确的嵌套顺序进行匹配。 3. 每一个右括号都必须存在对应的左括号。 如果字符串有效,返回 `True`,否则返回 `False`。
Array
给定一个正整数数组 `nums`,对于数组中的每一个元素 `nums[i]`,找到其右侧第一个严格大于 `nums[i]` 的元素。如果右侧不存在严格大于 `nums[i]` 的元素,则对应位置返回 `-1`。返回数组 `result`,其中 `result[i]` 表示 `nums[i]` 对应的下一个更大元素。要求算法时间复杂度为 O(n)。
Binary Search
给定一个原本按升序严格递增排列的整数数组 `nums`,数组在某个未知的旋转点进行循环旋转,并且数组中不存在重复元素。给定目标值 `target`,要求在 `nums` 中查找 `target` 的下标。如果 `target` 存在,返回其下标;如果不存在,返回 `-1`。要求算法时间复杂度为 O(log n)。
System Design
设计一个高吞吐、高可用的 Weather Status Service,用于实时接收全球大量地面气象传感器持续上报的高频多维遥测数据,并向外部客户端提供低延迟的天气状态查询服务。 系统需要支持数十万至数百万级传感器,每个传感器以约 1 秒至 10 秒的频率上报数据。单个数据包至少包含 `sensor_id`、经纬度、测量时间戳以及气温、湿度、气压、风速、风向、降雨量等遥测指标。 系统需要提供实时天气状态查询、传感器生命周期状态管理、区域天气聚合、历史天气趋势查询以及外部极端天气预警接入能力。 系统峰值写入可能达到 50K 至 100K+ QPS,同时面向终端用户的读取请求可能达到数百万级并发,实时读取要求 P99 延迟低于 10ms。 由于原始时序数据持续增长,系统还需要支持历史数据降采样、冷热数据分层和数据保留策略。 外部天气预警数据源包含 `alert_type`、影响区域的地理多边形、严重级别以及有效期,系统需要能够将这些预警与传感器所在区域进行空间关联。:contentReference[oaicite:0]{index=0}
Array
给定一个整数数组 `temperatures`,其中 `temperatures[i]` 表示第 `i` 天的温度。返回一个等长数组 `answer`,其中 `answer[i]` 表示从第 `i` 天开始,需要等待多少天才能遇到一个严格高于当天温度的未来日期。如果未来不存在更高温度,则 `answer[i] = 0`。核心是找到每个元素右侧第一个严格大于它的元素,并计算两个下标之间的距离。
String
在不使用 `Double.parseDouble()` 或 `Double.valueOf()` 等内置转换函数的情况下,实现一个字符串到 `double` 的转换器。输入可能包含正负号、整数部分、小数点、小数部分以及前导或尾随空格。需要正确识别非法输入,例如多个小数点、非法字符、只有符号没有数字等,并完成字符串的线性解析。面试中不仅考察基本 Parser 实现,还重点考察候选人对于输入契约、边界条件、代码质量以及浮点数精度问题的理解。
Interval
给定一个 selling partner 的多个 promotion,每个 promotion 由 `startTime` 和 `endTime` 表示其运行时间区间。要求计算任意时间点上同时运行的 promotion 数量,并返回整个时间范围内的最大并发 promotion 数量。需要根据题目定义确定 `startTime` 和 `endTime` 相同或多个事件发生在同一时间时的处理方式。
Dynamic Programming
给定一个未排序的整数数组 `nums`,要求找到其中最长严格递增子序列的长度。子序列中的元素必须保持原数组中的相对顺序,但不要求连续。对于严格递增子序列,后一个元素必须严格大于前一个元素。
Graph
给定一个大型社交网络的无向无权图,其中每个节点表示一个用户 Profile,每条边表示两个用户之间存在好友关系。给定起始用户 `startProfile` 和目标用户 `targetProfile`,要求通过 Friends of Friends 关系找到连接两个用户的最短路径,并返回按照连接顺序排列的完整 Profile 列表。返回结果必须包含起点和终点;如果不存在连接两个用户的路径,则返回空列表。
Monotonic Stack
给定一个电影列表 `movies`,每部电影包含电影名称 `name` 和整数评分 `rating`。对于列表中的每一部电影,找到它右侧第一个评分严格高于当前电影的电影,并返回对应的电影名称;如果右侧不存在评分更高的电影,则返回 `"none"`。结果需要保持与原电影列表相同的顺序。
Algorithms
给定一个 `m x n` 的整数矩阵 `matrix`,要求返回矩阵中最长连续递增路径的长度。路径可以从任意单元格开始,也可以在任意单元格结束,每一步只能向上、下、左、右四个正交方向移动,不能进行对角线移动。同一条路径中每个单元格最多使用一次。对于连续递增约束,若当前单元格的值为 `matrix[r][c]`,则下一步只能移动到值恰好等于 `matrix[r][c] + 1` 的相邻单元格。
System Design
设计一个面向全球海量电商交易的自动化税务报告系统。系统需要接收订单、支付、退款和退换货等上游交易事件,根据客户地址、卖家信息、商品 `SKU` 及适用税务规则计算税费,并持续生成按税务管辖区、时间周期及商品类别聚合的税务数据,最终按照不同税务机关要求生成 `CSV`、`XML`、`SAF-T` 等格式的申报文件。系统需要支持数十亿级年度交易规模、高峰流量、金融级数据一致性、长期合规审计以及历史交易不可篡改保存。
String
给定两个以字符串形式表示的非负大整数 `num1` 和 `num2`,由于输入长度可能远超标准整数类型的表示范围,不能直接将其转换为 `int`、`long` 或其他固定宽度整数进行计算。要求模拟十进制竖式加法,从两个字符串的最低位开始逐位计算,并处理跨位进位,最终返回两个大整数精确相加后的字符串结果。输入可能包含前导零,因此结果需要保持规范的数值表示;同时需要考虑 `null`、空字符串以及非法非数字字符等异常输入。算法应支持长度达到 `10^5` 甚至更大的输入规模,并避免使用 `BigInteger` 等内置大数库。
HashSet
给定一组员工 `Employee`,每名员工包含员工 ID、姓名、兴趣列表以及已经与其见过面的员工 ID 列表。实现 `findMatches` 方法,给定目标员工 ID,返回其他员工的 ID 列表。候选员工必须满足两个条件:与目标员工至少拥有一个共同兴趣,并且目标员工此前没有与该员工见过面。基础版本不要求特定返回顺序;Follow-up 要求按照与目标员工的共同兴趣数量从高到低对匹配结果进行排名。
System Design
设计一个企业内部员工兴趣匹配应用,为公司员工提供基于共同兴趣的社交匹配和推荐能力。系统需要支持员工维护个人信息和兴趣,通过匹配算法发现具有共同兴趣且尚未建立联系的其他员工,并向用户提供推荐结果。系统需要考虑用户、兴趣以及匹配关系的数据建模,同时支持高效查询、重复推荐控制以及后续兴趣数据更新。设计需要覆盖核心用户流程、服务划分、数据库 Schema、API、缓存以及客户端与后端之间的交互方式。
Sweep Line
给定一组促销活动,每个促销由开始时间 `start` 和结束时间 `end` 表示。将每个促销的有效区间定义为左闭右开区间 `[start, end)`,即促销在 `start` 时刻开始生效,在 `end` 时刻已经结束。请实现函数 `max_concurrent_promotions`,计算任意时刻同时运行的促销活动最大数量,并返回第一次达到该最大数量的时间点。如果多个事件发生在同一时间,需要按照区间 `[start, end)` 的定义正确处理开始事件和结束事件的先后关系。
Object-Oriented Design
设计并实现一个可扩展的日志处理器 `log_processor`。系统接收多条日志记录,并允许注册多个独立的 `extractor` 对日志进行分析。不同的 `extractor` 可以负责不同指标,例如统计 Database Error 的总数量,以及统计每个 `agent` 对应的 Call Abandoned 次数。处理器需要避免依赖全局状态,并将最终统计结果作为 `metrics` 返回,使新的统计规则可以在不修改日志处理主流程的情况下继续扩展。
Quickselect
给定一个整数数组 `packages`,其中 `packages[i]` 表示第 `i` 个送货司机在指定时间内完成配送的包裹数量,以及一个整数 `n`。请找出并返回第 `n` 高的配送数量,即按照配送包裹数量从高到低排列后位于第 `n` 个位置的值。除非题目明确要求不同的配送数量,否则具有相同配送数量的司机分别占据排名位置。例如 `[10, 10, 8]` 中,第 `2` 高仍然是 `10`。要求考虑比完整排序更高效的实现方式。
Design Patterns
使用 C++ 实现一个线程安全的单例类 `Singleton`,确保在整个程序生命周期中最多只创建一个实例,并提供统一的全局访问入口。外部代码不能直接调用构造函数创建对象,同时需要考虑多个线程并发调用 `getInstance()` 时可能产生的竞态条件。实现应保证实例初始化只发生一次,并避免因为错误的实例创建位置导致递归构造或创建多个对象。
Greedy
给定 `N` 个待处理任务,每个任务包含唯一标识 `id`、截止时间 `deadline` 和完成任务后获得的奖励 `reward`。每个任务执行固定消耗 `1` 个时间单位,同一时间只能执行一个任务,并且任务必须在其 `deadline` 或之前完成才能获得奖励。请设计一个算法,选择并安排部分任务的执行时间,使最终获得的总奖励最大,并返回一种合法的任务执行顺序以及对应的最大奖励值。任务不可抢占,`N` 可能达到 `10^5`,并且 `deadline` 可能远大于 `N`。:contentReference[oaicite:0]{index=0}
Dynamic Programming
给定一个 `m x n` 的整数矩阵 `matrix`,请返回矩阵中最长严格递增路径的长度。路径可以从任意单元格开始,每一步只能移动到上、下、左、右四个方向之一的相邻单元格,并且下一个单元格的值必须严格大于当前单元格的值。每个位置可以作为路径起点,需要计算所有可能起点对应的最长递增路径,并返回其中最大值。
String Matching
设计并实现一个动作游戏中的技能触发系统 `SkillDetector`。系统预先存储多个技能及其对应的按键序列,例如某个技能可能由 `["DOWN", "RIGHT", "A"]` 触发。玩家会持续输入按键,系统需要维护最近的按键历史,并在每次接收到新按键后判断当前历史的后缀是否匹配一个或多个已注册技能。如果匹配成功,则返回所有被触发的技能 `id`,并立即清空当前按键缓冲区,随后从新的输入重新开始匹配。
Depth-First Search
给定一个包含 `R` 行、`C` 列的网格,每个格子代表一个可以用于图案连接的点。可以从任意格子开始绘制路径,每次只能向上、下、左、右四个方向移动一个格子,不能进行对角线移动,并且同一个格子在一条路径中最多只能访问一次。请计算满足这些约束条件的不同路径总数。Follow-up 中还需要考虑允许对角线移动,以及只统计长度至少为 `minLen` 的路径。
Simulation
有一扇一次只能允许一个人通过的门,每个人通过门需要 `1` 秒。给定两个长度为 `n` 的数组 `arrival` 和 `direction`,其中 `arrival[i]` 表示第 `i` 个人到达门口的时间,`direction[i]` 表示该人的移动方向:`0` 表示进入,`1` 表示出去。对于同一方向中同时等待的人,按照到达顺序处理;如果多人在同一时刻到达,则按照原始输入顺序处理。当进入和出去两个方向同时有人等待时,根据上一秒门的使用状态决定优先级:如果上一秒有人进入,则进入方向优先;如果上一秒有人出去,则出去方向优先;如果上一秒门没有被使用,则出去方向优先。请返回数组 `result`,其中 `result[i]` 表示第 `i` 个人实际通过门的时间。
Information Retrieval
实现一个支持短语搜索的文档检索系统。系统中每个词都可以对应一组位置记录 `DP`,其中 `DP` 保存该词出现的文档 `docId` 以及它在文档中的位置 `position`。系统提供 `Cursor` 接口,用于顺序访问这些位置记录,并支持 `get()`、`advance()`、`isValid()` 和 `seek()` 等操作。给定一个由多个单词组成的短语,例如 `"new york city"`,需要找出所有包含该完整连续短语的文档,并输出对应的 `docId`。如果第一个词出现在某个文档的位置 `p`,则第二个词必须出现在同一文档的位置 `p + 1`,第三个词必须出现在 `p + 2`,依此类推。结果中每个文档只输出一次。
Greedy
给定两个整数列表 `list1` 和 `list2`,以及整数 `K`。一个列表的 `K-window` 定义为该列表前 `K` 个位置中的所有不同元素组成的集合。例如,对于列表 `[1, 1, 2, 3]`,其 `1-window = {1}`,`2-window = {1}`,`3-window = {1, 2}`。现在允许从 `list2` 中删除元素,同时保持剩余元素的原始相对顺序。请删除尽可能少的元素,使删除后 `list2` 的 `K-window` 与 `list1` 的 `K-window` 没有任何公共元素,并返回最少删除数量。若删除后 `list2` 的长度小于 `K`,则其 `K-window` 由当前所有剩余元素中的不同值组成。
Array
给定两个整数列表 `list1` 和 `list2`,以及整数 `k`。 定义一个列表的 `k-window` 为该列表前 `k` 个位置中的所有不重复元素组成的集合。 要求从 `list2` 中删除最少数量的元素,使删除后的 `list2` 的 `k-window` 与 `list1` 的 `k-window` 不存在任何共同元素。 删除元素后需要保持剩余元素的相对顺序不变。 其中: - `k-window` 根据列表前 `k` 个位置计算,而不是前 `k` 个不同元素。 - 如果前 `k` 个位置存在重复元素,集合中只保留一个。
Tree
给定一棵树以及一个目标节点 `target`,要求返回该节点在同一深度下右侧紧邻的下一个节点。 如果目标节点所在层没有位于其右侧的节点,则返回 `null`。 树节点只提供节点引用,不保证目标节点一定是叶子节点。
Simulation
设计一个单电梯控制系统,实现电梯在有限楼层范围内根据用户请求移动。 电梯运行范围为 `0` 到 `5` 楼。 系统需要处理用户的上下楼请求,并控制电梯移动方向。 电梯每次只能移动一层,并且经过每一层时需要判断当前楼层是否存在需要处理的请求。 当没有请求时,电梯进入空闲状态等待新的请求。
Object-Oriented Design
设计并实现一个内部活动日历系统 Prime Calendar。系统需要支持添加活动和查询指定日期的活动。 每个活动包含活动标题 `title`、日期 `date`、开始时间 `startTime` 和结束时间 `endTime`。 添加活动时,如果该日期已有活动与新活动存在时间重叠,则不能添加。 系统需要提供接口判断活动是否成功添加,并支持返回指定日期的全部活动。
Machine Learning System Design
本次面试包含 AI/ML 系统设计讨论以及算法基础考察。 第一部分要求候选人介绍一个具有代表性的机器学习项目,并详细说明强化学习系统架构、奖励函数设计、在线与离线训练策略以及工程优化方案。 第二部分考察经典算法问题,包括最大子数组和以及最长递增子序列,需要设计高效算法并分析时间空间复杂度。
Array
给定一个整数数组 `nums`,判断数组中是否存在严格多数元素(Strict Majority Element)。 严格多数元素定义为出现次数严格大于数组长度一半的元素,即某个元素出现次数满足 `count > n / 2`。 如果存在严格多数元素,返回该元素;如果不存在,返回空结果。 输入数组可能已经按照 `caller ID` 排序,但算法设计不应依赖数组排序性质。