HRT面试软件工程师面试VO面试真实面经算法题SystemDesign

HRT 软件工程师面试实录 2026:真实面经完整复盘

HRT面试第一人称完整复盘:涵盖算法Coding、系统设计、Behavioral面试。还原真实面试对话、高频题目与解题思路,附准备策略与注意事项,助你高效备战HRT技术面试。

Sam · · 15 分钟阅读

公司:HRT 岗位:软件工程师 (SDE) 面试形式:Virtual Onsite 结果:Pass → Offer

大家好,我是 Sam。这次来分享一下我参加 HRT SDE 面试的完整经历。HRT 的面试风格比较偏向经典的算法和系统设计,题目不算偏,但面试官对细节的追问很深入。整体下来一共三轮,加上 OA,我把每轮的关键点和解题思路都整理出来了。

OA 阶段:BFS + 状态压缩的经典组合

HRT 的 OA 是在 HackerRank 上进行的,60 分钟两道题。第一道题就是那道经典的地牢游戏变体——带钥匙和门的 BFS 问题。这道题在 VO 中又出现了一次,说明它确实是 HRT 的高频考点。

核心题目:钥匙与门(Dungeon with Keys and Doors)

题目描述

给你一个 m × n 的网格,其中:

  • '.' 表示空地,可以走
  • '+' 表示墙壁,不能走
  • 'a''f' 表示小钥匙
  • 'A''F' 表示对应的门,需要持有对应小写钥匙才能通过
  • '@' 表示你的起点

目标是用最少的步数收集所有钥匙。

面试官还原对话

面试官:请描述一下这道题的输入输出。 :输入是一个二维字符数组,输出是收集所有钥匙的最少步数。如果无法收集所有钥匙,返回 -1。 面试官:网格的规模多大? :题目说最多 30 × 30,钥匙最多 6 把。 面试官:好,你开始讲思路吧。

思路分析

这道题本质上是一个 BFS 问题,但与传统的最短路径搜索不同。常规 BFS 只需要考虑位置 (x, y),而在这里我们还需要记录当前收集到的钥匙状态。因此需要把状态设计为 (x, y, keys_mask)。

keys_mask 是一个 bitmask,用来记录哪些钥匙已经被收集。比如如果钥匙是 ‘a’ 到 ‘f’,那么就可以用六位二进制来表示是否已持有。

from collections import deque

def shortestPathAllKeys(grid: list[str]) -> int:
    """
    带钥匙和门的 BFS 最短路径问题。
    
    状态: (x, y, keys_mask)
    时间复杂度: O(m * n * 2^K),K 是钥匙数量
    空间复杂度: O(m * n * 2^K)
    """
    m, n = len(grid), len(grid[0])
    
    # 找到起点和钥匙总数
    start_x, start_y = 0, 0
    total_keys = 0
    for i in range(m):
        for j in range(n):
            if grid[i][j] == '@':
                start_x, start_y = i, j
            elif 'a' <= grid[i][j] <= 'f':
                total_keys += 1
    
    target = (1 << total_keys) - 1  # 所有钥匙都收集到
    
    # BFS
    queue = deque([(start_x, start_y, 0, 0)])  # x, y, keys, steps
    visited = {(start_x, start_y, 0)}
    
    directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
    
    while queue:
        x, y, keys, steps = queue.popleft()
        
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            
            if 0 <= nx < m and 0 <= ny < n:
                cell = grid[nx][ny]
                
                if cell == '+':
                    continue
                
                if 'A' <= cell <= 'F':
                    # 门:检查是否持有对应钥匙
                    key_idx = ord(cell) - ord('A')
                    if not (keys & (1 << key_idx)):
                        continue
                
                new_keys = keys
                if 'a' <= cell <= 'f':
                    key_idx = ord(cell) - ord('a')
                    new_keys = keys | (1 << key_idx)
                
                if new_keys == target:
                    return steps + 1
                
                state = (nx, ny, new_keys)
                if state not in visited:
                    visited.add(state)
                    queue.append((nx, ny, new_keys, steps + 1))
    
    return -1

面试官追问

面试官:这个解法的时间复杂度是多少? :状态空间是 m × n × 2^K,其中 K 是钥匙数量。每一步 BFS 扩展到 4 个方向,所以时间复杂度是 O(m × n × 2^K)。空间复杂度也是 O(m × n × 2^K) 用于 visited 集合。 面试官:如果钥匙数量增加到 15 把,2^15 = 32768,这个解法还能跑吗? :m × n 最大是 900,乘以 32768,状态空间大约 3 × 10^7。在 C++ 里可以跑,但 Python 可能会超时。这时候可以考虑 A* 算法,用曼哈顿距离作为启发函数来剪枝。 面试官:很好,那你讲讲 A* 的启发函数怎么设计。 :对于钥匙收集问题,一个合理的启发函数是最远未收集钥匙的曼哈顿距离。这满足可采纳性(admissible),因为实际步数不可能比直线距离更短。

ASCII 状态转移图

网格示意:
  +---+---+---+
  | @ | a | A |
  +---+---+---+
  | . | . | b |
  +---+---+---+

状态转移:
  (0,0, 0b00) --右--> (0,1, 0b01) --右--> (0,2, 0b01) --下--> (1,2, 0b11)
    起点     拿到a键     通过A门       拿到b键 (目标达成!)
  
  keys_mask: 0b00 → 0b01 → 0b01 → 0b11
  步数:        0    →   1   →   2   →   3

性能优化讨论

面试官:除了 A*,还有没有其他优化方法? :有几点可以考虑:

  1. 双向 BFS:从起点和目标钥匙位置同时进行 BFS,可以减少搜索空间。
  2. 位运算优化:用整数代替集合来存储 visited 状态,位操作比 set 操作快很多。
  3. 提前计算钥匙位置:预处理所有钥匙的坐标,避免每次遍历整个网格。
  4. 剪枝:如果某个状态已经走过的步数超过了当前最优解,直接跳过。

沟通与实现的重要性

在写代码之前,必须先把思路讲清楚。HRT 的面试官非常看重 candidate 能否在有限时间里清晰解释问题、提出合理的方案,并展示出良好的代码组织能力。

我的经验是,面试时采用以下沟通流程:

  1. 复述题目,确认理解一致(2 分钟)
  2. 讨论边界情况和约束(2-3 分钟)
  3. 给出算法思路,分析复杂度(3-5 分钟)
  4. 写代码,边写边解释(15-20 分钟)
  5. 手动测试 2-3 个用例(5 分钟)
  6. 讨论优化和 follow-up(剩余时间)

因为我是 Python track,面试官对 Python 的语法和数据结构熟悉程度要求很高,所以实现中最好用合适的数据结构(比如 queue、set、dict),而不是依赖语法糖或不熟悉的写法。

面试总结

成功经验

  1. 充分准备高频题:HRT 的面试题目集中在 BFS + bitmask、DFS + memoization、贪心等经典模式上,提前准备 LeetCode 高频题非常有必要。重点准备 LeetCode 864(Shortest Path to Get All Keys)的原题和变体。
  2. Behavioral 故事要准备充分:使用 STAR 框架准备了 6 个核心故事,覆盖 Leadership、Conflict、Innovation 等场景。
  3. 沟通表达要清晰:解题过程中要主动与面试官沟通思路,不要闷头写代码。每写一段就停下来解释。
  4. 边界条件要主动讨论:面试官很看重候选人对 edge cases 的考虑,比如网格只有一个元素、没有钥匙、起点就是终点等情况。

面试注意事项

时间管理:每轮 45-60 分钟,需要合理分配时间给题目、讨论和 follow-up 问题。BFS + bitmask 这类题,写代码部分需要 20-25 分钟,不要花在讨论上太久。

技术深度:HRT 的面试官对技术细节要求很高,特别是状态设计、复杂度分析、优化空间。写完代码后主动讨论 A*、双向 BFS 等优化方案。


推荐阅读


💡 需要面试辅导?

如果你对准备技术面试感到迷茫,或者想要个性化的面试指导和简历优化,欢迎联系 Interview Coach Pro 获取一对一辅导服务。

👉 联系我们 获取专属面试准备方案


准备好拿下下一次面试了吗?

获取针对你的目标岗位和公司的个性化辅导方案。

联系我们