目录
正在加载目录...

HRT OA 真题解析:矩阵、前缀和与字符串题解析

最近整理了一套 HRT 的 OA 题,一共四道:矩阵上的反弹对角线、带前缀和的交易策略优化、字符串两两交换,还有激光器与机器人。难度不算离谱,但每道题的规则都有些细节,读题时稍不留神就容易写错。下面按顺序说说我的想法。

1. 反弹对角线

HRT OA 真题解析:矩阵、前缀和与字符串题解析

给定一个大小为 n × n 的整数方阵 matrix。我们将一种 反弹对角线(bouncing diagonal) 定义为:从最左侧列中的某个单元格出发,沿着右上方的对角线方向移动,直到到达最右侧列。如果移动过程中到达矩阵顶部,则需要在垂直方向上反弹,继续移动。

解题思路:计算左侧第一列每个元素对应的 bouncing diagonal 的权重。对于起点位于第 r行、第 0 列的元素,每向右移动一列,行方向都会上下反弹,因此第 c 列对应的行可以表示为 abs(r-c)。遍历每个起点,再遍历所有列,将对应位置的元素累加,得到该起点的权重。

将每个元素保存为“权重和第一列元素值”的二元组,然后按权重升序排序;如果权重相同,则按照元素值升序排序。最后取出排序后的第一个元素值即可。时间复杂度主要为 O(n^2),排序的时间复杂度为 O(n log n)。

2. 货币交易策略

HRT OA 真题解析:矩阵、前缀和与字符串题解析

假设你正在开发一个用于货币交易的算法。目前,你有一个原型算法,用于处理单一货币的交易。每天,该算法可以恰好买入 1 单位货币、卖出 1 单位货币,或者不进行任何操作。给定一个正整数数组 rates,其中 rates[i] 表示第 i 天的货币价格。同时,给定一个由 -1、0 和 1 组成的数组 strategy,其中 strategy[i] 表示算法在第 i 天应执行的操作:

  • -1 表示买入(buy)。
  • 0 表示持有(hold),即不买入也不卖出。
  • 1 表示卖出(sell)。

此外,还给定一个整数 k,且保证 k 为偶数。为了提高算法的收益,你可以按照以下方式修改 strategy:

  1. 选择一段长度恰好为 k 的连续元素区间。
  2. 将所选区间前半部分的所有元素设为 0。
  3. 将所选区间后半部分的所有元素设为 1。

你的任务是选择最优的区间,使算法的总利润(profit)最大化。利润定义为所有卖出操作对应的价格之和减去所有买入操作对应的价格之和。换句话说,利润等于最终金额与初始金额之差。当最终金额低于初始金额时,利润可以为负数。

解题思路:计算原始策略下的总利润,其中 strategy 为 -1 表示买入,对利润的贡献为 负的 rate;1 表示卖出,对利润的贡献为 正的 rate;0 则没有贡献。然后枚举所有长度为 k 的连续区间,将区间前半部分的元素全部修改为 0,后半部分的元素全部修改为 1。为了快速计算每个区间修改前后的利润,可以分别建立原始利润前缀和与 rates 的前缀和。修改前的利润可以通过原始利润前缀和求出,修改后则只有区间后半部分的 rates 会产生正利润。

计算每个区间修改后带来的利润增量,并取最大值即可。由于题目允许不进行修改,因此最大增量的初始值应设为 0。整体时间复杂度为 O(n),空间复杂度为 O(n)。

3. 字符串两两交换

HRT OA 真题解析:矩阵、前缀和与字符串题解析

给定一个由小写英文字母组成的字符串 s,你的任务是将其中的字母两两交换位置。具体来说,如果 s = c-1c-2c-3c-4...(其中 c-i 表示字符串 s 中的第 i 个字母),那么输出应为 c-2c-1c-4c-3...。如果字符串的长度为奇数,则最后一个字母保持原来的位置不变。

注意: 不要求提供最优解,只要解决方案的时间复杂度不超过 O(s.length^3),就能满足执行时间限制。

解题思路:遍历字符串,每次交换位置 (i, i + 1) 上的两个字符。如果不存在 i + 1,则保留当前字符不变。按照题目要求模拟即可。

4. 激光器与机器人

HRT OA 真题解析:矩阵、前缀和与字符串题解析

想象一个大小为 numRows × numColumns 的棋盘,上面放置了若干激光器。这些激光器的位置由二维数组 laserCoordinates 指定,其中 laserCoordinates[i] 是一个包含两个元素的数组,表示第 i 个激光器的中心坐标。位于单元格 (row, column) 的激光器会摧毁同一行(行索引为 row)和同一列(列索引为 column)上的所有物体。现在,假设一个机器人位于坐标 (curRow, curColumn)。机器人只能在棋盘范围内沿直线移动,可以选择向左、向右、向上或向下移动。你的任务是计算机器人在被激光器摧毁之前,沿任意一个方向最多能够安全经过多少个单元格。

注意: 可以假设机器人初始所在的单元格受到保护,即使该单元格位于激光器的摧毁范围内,激光器也无法摧毁位于该单元格的机器人。

解题思路:机器人只能选择一个方向沿直线移动,求碰到激光覆盖区域或棋盘边界前,最多能经过多少个安全格子。我们可以遍历所有激光器,分别维护机器人上下左右最近的被覆盖行和列,同时特判起点所在的行或列被激光覆盖的情况即可。

总结

这四道题的难度其实不高,主要考的是前缀和、排序、遍历这些基础功夫,但每道题都有一两处容易踩坑的地方:第一题的反弹行号怎么算,第二题要不要允许”不修改”,第四题起点那个格子的保护规则。在准备 HRT OA时,建议先自己把这四题完整写一遍,不要先看思路。写完再回头对照,想想有没有更简洁的写法。比起背某一道题的答案,把”为什么这样做是对的”和”边界该怎么处理”想清楚,遇到变体题时才能更快找到方向。

如果你正在准备 HRT或其他大厂的 OA 或面试,除了刷题,也可以结合真实面经熟悉常见题型和考察方向。InterviewShow 整理了 Microsoft、Amazon、Google、Stripe、TikTok 等科技公司的面试资料,可领取相关公司的 OA/VO 真题,帮助你了解常见考点和面试形式。我们也提供 OA 辅助和面试辅助服务,覆盖 Coding、System Design 和 BQ。你可以查看服务介绍,或直接联系我们了解详情。

FAQ

1. HRT OA 一般考哪些编程题?

HRT OA 可能涉及数组、字符串、矩阵遍历、排序、前缀和及模拟等算法考点。不同岗位和招聘批次的题目可能有所不同,建议结合基础算法练习和 OA 真题进行准备。

2. HRT OA 编程题难吗?

HRT OA 的题目难度会因岗位和测评内容而异。有些题目主要考察基础模拟和边界处理,有些则需要分析区间变化、优化计算过程。除了掌握算法,还需要准确理解题意并考虑特殊情况。

3. 如何准备 HRT OA Coding?

建议优先练习数组、字符串、矩阵、排序和前缀和等常见考点,同时训练限时解题能力。完成题目后,可以检查时间复杂度、边界条件,以及是否存在更简洁的实现方式。

END