先分岗位
Salesforce 的不同岗位和团队可能考不同内容。先核对 JD 与面试邀请,再选对应题型。
Question Study
本地面经库有 30 条来源 URL 去重后的记录,其中 30 条有正文;目前整理出 35 道代表练习题,其中 35 道已完成独立深文。题目清单仍在逐帖核对和补充。
Reading Guide
题目根据面经方向重新表述,其中可能包含站内攻略建议的训练题;它们不是公司的官方题库,也不保证下一场面试重复出现。
Salesforce 的不同岗位和团队可能考不同内容。先核对 JD 与面试邀请,再选对应题型。
相同核心考点只保留一条,后续的附加约束放在原题里练,避免把同一道题当成多道题刷。
先口述输入、输出和边界,再写核心方案;最后解释复杂度、失败路径和面试官可能追加的约束。
Featured Deep Dive
先把这道题的核心思路讲完整,再根据自己的目标岗位挑下面的题继续练。
为一个调用成本高的 API 设计用户可配置月度限额:配置生效与自然月边界、并发原子预占、请求去重、用量查询、超额拒绝和下游失败的扣费口径。
Deduplicated Question Map
同一题的追加条件合并在一条里。题目清单用于确定训练范围;具体流程和准备优先级见公司攻略。
为一个调用成本高的 API 设计用户可配置月度限额:配置生效与自然月边界、并发原子预占、请求去重、用量查询、超额拒绝和下游失败的扣费口径。
阅读这道题的独立深文 →设计线上咖啡点单系统:从门店菜单、下单与状态流转,到高峰扩容和顾客/门店通知;澄清 SQL 查询、支付与库存语义。
解题切入:咖啡点单先定义门店、菜单、订单状态及支付/库存口径;峰值扩容要拆读多写少的菜单与写入敏感的下单,顾客和门店通知通过订单事件幂等发送。
阅读这道题的独立深文 →讲解通知系统的高层架构:事件接入、模板、用户偏好、渠道发送、重试与死信;区分简历项目细节与训练设计假设。
解题切入:通知系统的事件入口、模板、偏好、渠道适配器与投递历史分层;重试与死信需有稳定消息 ID,不能把外部渠道的成功回执当作端到端送达保证。
阅读这道题的独立深文 →设计类似 ChatGPT 的 analytics dashboard:先定义 DAU、latency 等指标口径,再讨论事件采集、聚合、迟到补算与查询体验。
解题切入:分析看板先写清 DAU 的用户去重与时区、latency 的起止事件与分位数,再处理事件版本、迟到数据、预聚合和回填。
阅读这道题的独立深文 →给订单与用户表,找上个月消费额最大的用户;明确时间区间、成功订单、退款、同分与时区,写可验证 SQL。
解题切入:上月消费最高用户需以明确时区的半开时间区间过滤成功订单,按用户合计净支付额;退款与同分口径先确认,不要把上月写成固定 30 天。
阅读这道题的独立深文 →求 x 的最长子序列长度,使该子序列同时是 y 的连续子串;枚举 y 的起点,扫描 x 跳过不匹配字符,讨论 O(|x||y|) 与空串。
解题切入:固定 y 的每个起点,扫描 x 匹配 y 的连续前缀;x 可以跳字符、y 不可跳。每个起点都选 x 中最早可用字符,得到 O(|x||y|) 时间与 O(1) 辅助空间。
阅读这道题的独立深文 →给字符串数组,求各串最少替换多少字符才能没有相邻相同;在可选新字符足够多时按连续段累加 floor(L/2),讨论受限字母表反例。
解题切入:相邻相同段长 L 在可使用第三种或新字符时需 floor(L/2) 次替换;先确认允许的字符集,两字符限制下 `baab` 用一处替换无法修好。
阅读这道题的独立深文 →对每个 nums[i] 判断同值是否在严格左侧和严格右侧出现,分别构造两个二进制字符串;用前缀集合与后缀频次在线性时间求解。
解题切入:扫描前统计全部频次;每个下标先从右频次减去当前值,再判断右侧是否仍有同值;左侧用已见集合判断,最后再把当前值加入集合。
阅读这道题的独立深文 →二进制串中每秒所有 01 同时换为 10,求稳定所需秒数;扫描时记录前方 0 的数量与 1 的流水线阻塞时间。
解题切入:扫描同步 01→10 串时,当前 1 前有 z 个 0 才需要移动,完成时间更新为 max(此前时间+1,z);新一秒不能继续处理上一秒刚产生的 01。
阅读这道题的独立深文 →纯内存 PhoneDirectory:assign(number) 分配指定空号,get() 分配任意空号;定义号码全集、重复分配和空池行为,维持 O(1) 空闲链表。
解题切入:有限号码池可用 free 标志与空闲双向链表:assign 指定号码时 O(1) 摘除,get 摘掉链头;重复分配不改状态,内存版不自动具备并发或持久化。
阅读这道题的独立深文 →单链表只保留每个整数首次出现的原节点,删去后续重复节点;用 seen 集合和 previous/current 指针保持顺序与节点身份。
解题切入:链表去重时 seen 记录已保留的值,previous 永远指向最后一个保留节点;删除当前重复节点后 previous 不动,先保存 next 才改链。
阅读这道题的独立深文 →数字流中每项离正确升序位置最多 k 位,且不能缓存全流;用大小 k+1 的最小堆边读边输出,解释位移界与缺包语义。
解题切入:每项距其排序位置最多 k 时,下一最小值必在前 k+1 个尚未确定的输入中;维护最小堆边读边输出,内存 O(k+1),不能把数字排序擅自解释成 UDP 缺包恢复。
阅读这道题的独立深文 →0/1 矩阵中求最大全 1 正方形面积;比较暴力枚举与三邻居 DP,使用一维滚动数组时保护左上角旧状态。
解题切入:最大正方形以 (r,c) 为右下角的边长,在当前为 1 时等于 1+min(上、左、左上);一维 DP 要保存覆盖前的左上旧值,结果返回边长平方。
阅读这道题的独立深文 →0/1 矩阵中求最大全 1 矩形面积;逐行构造连续 1 柱状图,用单调栈求每行最大矩形并处理行尾哨兵。
解题切入:最大矩形逐行累积各列连续 1 的高度;单调栈在遇更矮柱时弹出并由新栈顶确定左边界,每列每行至多进出栈一次。
阅读这道题的独立深文 →有限棋盘上给骑士起点与终点,求最少跳跃步数;将格子视为单位权图,BFS 并处理小棋盘不可达情形。
解题切入:骑士最短步数把有限棋盘格看作无权图,按八种合法跳跃 BFS;第一次出队目标就是最短距离,队列耗尽表示小棋盘上不可达。
阅读这道题的独立深文 →求整数数组最长严格递增子序列长度;先说明 O(n²) 末位 DP,再用 tails 与二分降到 O(n log n),相等值不可延伸。
解题切入:严格 LIS 可用 tails[k] 保存长度 k+1 的递增子序列最小末值,bisect_left 替换首个大于等于当前值的位置;tails 长度是答案但数组本身未必是实际 LIS。
阅读这道题的独立深文 →整数数组选三个不同位置求最大乘积,要求 O(N);单遍维护三个最大与两个最小值,比较两类候选并处理负数。
解题切入:三数最大乘积的候选只有最大三个数的乘积,或最小两个数与最大数的乘积;两大负数可能翻正,一遍维护五个极值即可。
阅读这道题的独立深文 →设计异步 Job/Task 服务:创建与查询 API、任务状态转移、租约、退避重试、幂等和 RDBMS/NoSQL 取舍;处理 worker 崩溃与重复执行。
解题切入:异步 Job 服务以数据库持久状态和幂等键为事实源,outbox 投递、worker 租约与版本条件写防止丢任务和迟到覆盖;重试按可恢复错误分类。
阅读这道题的独立深文 →设计高吞吐多节点缓存层:租户安全的 key、TTL 与 LRU/LFU、数据库一致性、失效事件、hot key 与分片扩容。
解题切入:多节点缓存先定义 DB 为事实源、租户安全 key 与陈旧边界;失效事件带版本、TTL 兜底,hot key 用复制或本地短缓存与请求合并,普通分片扩容不自动解决单键热点。
阅读这道题的独立深文 →给用户和订单表,找从未消费过的用户;先定义 paid 与退款语义,再用 NOT EXISTS 覆盖没有任何订单或只有取消单的用户。
解题切入:从 users 出发用 NOT EXISTS 查无 paid 订单的用户,才能包含完全没有订单的人;取消单、退款与 NULL 外键须先固定语义,不能把‘从未’误写成上月没有。
阅读这道题的独立深文 →把 addTwoNumbers(a,b) 的一次调用改成 addThreeNumbers(a)(b)(c):逐层返回函数,用闭包保存已传参数并处理 JS + 的类型边界。
解题切入:柯里化固定三参时,前两次调用分别返回保存 a 与 a,b 的闭包,第三次才计算;每条调用链的闭包独立,先确认输入是 number 以避免 JS + 字符串拼接。
阅读这道题的独立深文 →用 setTimeout 实现 trailing debounce,连续调用只保留最后一次参数和 this;定义 cancel、flush、计时器边界与 event loop 延迟。
解题切入:trailing debounce 每次调用覆盖待执行参数/this,清掉旧 setTimeout 并重新计时;安静满窗口后只执行最后一次,cancel 和 flush 要清理同一闭包状态。
阅读这道题的独立深文 →实现简化 LRU 缓存,get/put 均摊 O(1);用哈希表定位节点、双向链表维护访问顺序,处理更新和容量为零。
解题切入:LRU 用 key→node 字典加双向链表,命中或更新时 O(1) 摘除并接到最新端,满容量时淘汰最旧端并同时删字典;容量 0 不存值。
阅读这道题的独立深文 →实现 LFU 缓存;按频次桶组织键,同频时训练版按 LRU 淘汰,保持最小频次与各索引同步,讨论均摊 O(1)。
解题切入:LFU 用 key→值、key→频次与频次→同频 LRU 桶,最小非空频次指针决定淘汰;同频 LRU 是训练约定,原帖未给平局规则。
阅读这道题的独立深文 →删除输入中一种字母的全部出现,使剩余串分成最少段内字符不重复的连续片段;枚举删除字母,每次贪心最长合法段。
解题切入:枚举删掉每种字符的全部出现;对过滤后字符串,重复字符出现前必须切段,贪心延长每个合法段给最少段数;空结果计 0 是训练约定。
阅读这道题的独立深文 →只用 HTML/CSS/JS 写红绿灯:红 4 秒、黄 1 秒、绿 1 秒;先约定切换顺序,用单计时器维持当前相位并清理页面生命周期。
解题切入:红绿灯用相位数组集中记录颜色与 4/1/1 秒时长,单个 setTimeout 在当前相位结束后渲染下一相位并重新计时;顺序未见原帖,需先约定。
阅读这道题的独立深文 →递归把 JSON/HashMap 展平并输出字符串;先定路径编码、数组、空容器和键名转义规则,再用 DFS 写训练实现。
解题切入:JSON 展平须先固定输出格式;训练版把对象键和数组下标编码成转义路径,DFS 到标量或空容器后存值,再序列化为字符串,不声称原帖指定该格式。
阅读这道题的独立深文 →给 1≤n<2^60,每步可对当前值加或减任意 2^i,求到 0 的最少操作数;用非相邻有符号二进制表示求最小非零位数。
解题切入:把加减 2^i 看成用 ±1 有符号二进制位表示 n,最少操作等于最少非零位;奇数时根据 n mod 4 选 ±1 消去连续低位,偶数位直接右移。
阅读这道题的独立深文 →举例说明你如何与不同角色沟通,怎样确认信息被正确理解并推动问题解决。
解题切入:沟通题用真实跨角色场景:说明不同人关心的约束、你如何确认理解、留下决策记录及观察结果,不只说自己定期开会。
阅读这道题的独立深文 →有没有指导过初级工程师?讲清目标、你的具体辅导方式、对方成长与结果。
解题切入:带教题区分代做任务与帮助初级工程师建立判断;写清目标、观察到的能力差距、反馈节奏和对方后续可独立完成的证据。
阅读这道题的独立深文 →讲一个工作中印象最深的 Bug:如何定位、止损、修复并改进测试或监控?
解题切入:Bug 题讲首次信号、复现、根因、受影响范围、回滚/修复、验证与长期防护;不要把保密生产数据或别人的责任编成自己的。
阅读这道题的独立深文 →讲一次你说服别人的经历:分歧是什么,你用什么证据和实验推动决定,结果如何?
解题切入:说服题先公平复述对方顾虑,再给可检验数据或小实验、决策人和结果;若最终不是你方案,也说明如何支持团队决定。
阅读这道题的独立深文 →讲一个 disagree and commit 的例子:不同意时如何表达,决定后如何执行并复盘?
解题切入:disagree 阶段给事实、风险和备选;commit 后不再私下阻挠,执行中监控共同约定的触发条件并复盘。
阅读这道题的独立深文 →介绍最具挑战的项目,说明难点、个人决策、协作、结果与如果重做会改变什么。
解题切入:挑战项目题把规模/约束、个人贡献、关键取舍与失败后修正分开;指标给基线和观察窗口,不能把团队全部成果据为己有。
阅读这道题的独立深文 →介绍最近一项研究工作:问题与假设、方法、基线、实验可信度、个人贡献及下一步。
解题切入:研究报告先给问题、相关工作、最强基线和实验设置,再讲消融/失败案例、局限与自己负责部分;Agent 泛话题不伪装成具体题。
阅读这道题的独立深文 →Next Step
题目只是准备的一部分;按公司攻略核对轮次、岗位差异和常见失分点。