独家 Harvey 面经:LLM 字符串匹配与高亮算法真题解析与满分解法
作为前沿的 AI 独角兽,Harvey 的技术面试一向以贴近实际业务场景著称。如果你正在寻找如何准备Harvey面试,或者想了解Harvey高频题目,那么这篇文章将为你深度揭秘一道极其经典的 Coding 真题——“大语言模型输出结果匹配与高亮”。这道题不仅考察了字符串处理的基本功,更对候选人的边界情况处理能力提出了极高的要求。
目录
- 题目背景与核心痛点
- 第一部分:基础高亮与重叠处理
- 第二部分:来源追踪与频率统计
- 关键边界条件:单词级匹配
- Python 代码满分实现
- 真实案例:2026年 Harvey 上岸之旅
- 面试救急:你的 Offer 保障
题目背景与核心痛点
在各类 AI 和大语言模型(LLM)的应用中,我们经常需要将模型的输出结果(Sentence)与参考知识库(Sources)进行交叉验证,并将引用的部分高亮展示给用户。这道题正是精准还原了这一核心业务链路。 题目给定一个 LLM 的输出结果(字符串)和一组参考来源(字符串列表),要求在输出中匹配这些短语,并进行特定格式的 HTML 高亮与引用标注。
第一部分:基础高亮与重叠处理
需求:在 Sentence 中找到所有匹配 Sources 的短语,并用 <yellow></yellow> 标签进行包裹。
难点:匹配的片段极有可能会出现重叠(Overlap)。例如,参考来源里有 "machine learning" 和 "learning model",如果原句是 "machine learning model",你需要巧妙地合并高亮区间,而不是生成嵌套或损坏的 HTML 标签(如 <yellow>machine <yellow>learning</yellow> model</yellow>)。这考察了经典的区间合并(Interval Merge)算法。
第二部分:来源追踪与频率统计
需求:在完成高亮标签包裹后,还需要在高亮结束标签后追加对应的 Source 编号(例如 [1][3])。
难点:在标注来源时,必须先考虑每个 matching phrase 在原句中的出现频率。这要求我们在扫描和合并区间的过程中,精准维护每个区间的原始来源索引,并在最终生成字符串时进行正确的映射和去重合并。
关键边界条件:单词级匹配
这是一道极其容易踩坑的 Edge Case!题目明确要求是单词级别匹配(Word Level Matching),而非简单的子串匹配。
例如:Sentence 为 "quick brown fox jumps",如果 match_phrase 是 "row",匹配结果应该为 0。绝不能错误地匹配到 "brown" 里面的 "row"。这意味着在实现查找逻辑时,我们需要借助正则表达式的词边界(\b)或者手动进行精细的单词分割与校验。
Python 代码满分实现
以下是基于区间扫描与正则表达式的解题思路:
import re
def highlight_llm_output(sentence, sources):
intervals = []
# 步骤 1: 找出所有单词级匹配的区间,并记录其来源索引
for idx, phrase in enumerate(sources):
# 使用 \b 确保单词边界,防止普通子串误匹配
# 注意:如果 phrase 包含特殊符号,需确保边界逻辑依然成立
pattern = r'\b' + re.escape(phrase) + r'\b'
for match in re.finditer(pattern, sentence):
# 记录 [起始位置, 结束位置, [来源索引]]
intervals.append([match.start(), match.end(), [idx + 1]])
if not intervals:
return sentence
# 步骤 2: 按起点排序,进行重叠区间合并
intervals.sort(key=lambda x: x[0])
merged = [intervals[0]]
for current in intervals[1:]:
last = merged[-1]
# 判断是否发生区间重叠
if current[0] <= last[1]:
last[1] = max(last[1], current[1])
# 合并来源索引并去重排序
last[2] = sorted(list(set(last[2] + current[2])))
else:
merged.append(current)
# 步骤 3: 逆序替换字符串,避免索引偏移问题
result = sentence
for start, end, source_indices in reversed(merged):
highlighted_text = f"<yellow>{sentence[start:end]}</yellow>"
sources_str = "".join([f"[{i}]" for i in source_indices])
# 拼装结果:替换原文本,并在尾部追加引用序号
result = result[:start] + highlighted_text + sources_str + result[end:]
return result
sentence = "The quick brown fox jumps. We use machine learning and learning models."
sources = ["row", "machine learning", "learning models"]
print(highlight_llm_output(sentence, sources))
真实案例:2026年 Harvey 上岸之旅
2026年年初,来自湾区的张同学找到了我们。他在之前的几轮独角兽面试中,屡屡因为忽略 Edge Cases 导致 Bug 频出而止步技术面。在了解到他即将参加 Harvey 的面试后,我们的资深架构师为他量身定制了Harvey面经突击训练营。
通过对Harvey高频题目的深度演练(正如上面这道高亮算法题),我们重点补齐了他对“重叠区间处理”、“引用去重”和“词边界正则”的敏感度。仅仅过了三周,张同学就在 Coding 轮次中展现了极其严谨的代码逻辑,不仅零 Bug 跑通所有测试用例,还主动和面试官探讨了正则在超长文本下的性能瓶颈。最终,他成功实现了Harvey上岸,拿到了令同龄人羡慕的高薪 Offer!
面试救急:你的 Offer 保障
算法面试总是倒在 Edge Case?系统设计毫无头绪?遇到刁钻的 Follow-up 只能干瞪眼? 不要让一次微小的失误毁掉你几个月的心血准备!无论你是需要全方位的职业技能提升,还是临考前 48 小时的“面试救急”,我们都能为你提供硅谷一线技术专家的 1v1 护航。