独家 Harvey 面经:LLM 字符串匹配与高亮算法真题解析与满分解法

作为前沿的 AI 独角兽,Harvey 的技术面试一向以贴近实际业务场景著称。如果你正在寻找如何准备Harvey面试,或者想了解Harvey高频题目,那么这篇文章将为你深度揭秘一道极其经典的 Coding 真题——“大语言模型输出结果匹配与高亮”。这道题不仅考察了字符串处理的基本功,更对候选人的边界情况处理能力提出了极高的要求。

目录

题目背景与核心痛点

在各类 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 护航。

👉 点击这里,立即预约你的专属面试辅导 👈

Previous
Previous

独家复盘:2026最新 IMC 面经与高频算法题硬核解析,助你斩获高薪 Offer!

Next
Next

2026年最新!微软面经全解析:高频算法题揭秘与上岸指南