Matroid OA 和部分 CodeSignal 场次风格接近:多道 Single-Function,偏模拟、窗口和基础结构,很少出偏门算法模板。整场节奏紧,但题意读清后实现量可控。复盘下最近我做的一场,方便对题的人直接对齐思路。

第 1 题:Good Tuple 计数

题意
给定整型数组 a。把任意连续三个位置 (a[i-1], a[i], a[i+1]) 看成一个 tuple:当且仅当其中恰好两个数相等、第三个不同时,称为 good tuple。例如 (2,1,2) 是 good,(1,1,1) 三个全等、(1,2,3) 两两都不同,都不是。tuple 允许重叠,任务是返回数组里 good tuple 的个数。题面不要求最优解,O(n2) 也能过。
解题思路
线性扫一遍。下标从 1 到 n-2,每次取出三个数,判断是否「恰有一对相等且不是三个全等」。可以用三次两两比较,或排序后看是否形成「两个相同、一个不同」的模式。注意不要越界,也不要把全等算进去。示例 a = [1,1,1,2,1,3,4] 里只有 (1,1,2) 和 (1,2,1) 两个 good,答案为 2。
第 2 题:3×3 滑动窗口是否覆盖 1~9

题意
给定一个只含数字 1~9 的 3 × n 矩阵。有一个 3×3 的窗口从左往右滑,一共 n-2 个位置。对每个位置判断:窗口内的 9 个数是否恰好覆盖 1 到 9 各一次(互不相同且都在 1~9 内)。返回长度为 n-2 的布尔数组,第 i 位表示第 i 个窗口是否满足。
解题思路
按列推进窗口。每次取当前连续三列共 9 个元素,丢进 set 或长度为 10 的布尔标记数组,检查是否恰好 9 个不同且都在 1~9。题面允许 O(n⋅9) 量级,不必上复杂结构。实现时注意列下标别越界,通常保证 n >= 3。
第 3 题:机器人斜向反弹路径求和

题意
二维整数矩阵中,机器人从给定坐标 (cellX, cellY) 出发,初始方向为右下 (+1,+1)。沿当前方向走,路径上的格子值累加;若下一步会走出矩阵,就把导致越界的那个方向分量反转(撞墙反射);若走到已经访问过的格子,或走到矩阵的四个角,则停止。终点格子的值按题面要求不重复计入。保证起点不是角。
解题思路
纯模拟。用集合记录访问过的坐标,每一步根据当前方向算下一格:若越界则反转对应分量再算一次;若下一格已访问或是角,结束循环。累加时注意起点必计、终点是否计要以题面为准。矩阵规模一般不大,模拟足够通过。容易错的地方是反射后是否立刻再走一步,以及四个角的判定要写全。
第 4 题:按顺序拆房子后的连通段数

题意
数轴上有若干房子,初始位置在数组 houses 中(互不相同)。queries 给出拆除顺序,每个位置一定在 houses 里且不重复。每拆掉一栋后,求当前还剩多少个「房子段」:位置连续相邻的房子算一段,左右都没有邻居的单独一栋也算一段。
示例:houses = [1,2,3,6,7,9],queries = [6,3,7,2,9,1],输出 [3,3,2,2,1,0]。
解题思路
正向:用集合维护当前仍在的房子。拆位置 x 时看 x-1、x+1 是否还在——左右都在则一段变两段(段数 +1),只有一侧在则段数不变,左右都不在则单独一栋被拆(段数 -1)。先根据全部 houses 算好初始段数,再按 queries 更新并记录。
也可逆向:假设 queries 全部拆完,再倒序把房子加回去,根据左右是否已存在决定新建还是合并,最后把记录序列反转。两种写法都能过,选自己不容易写错边界的即可。
一点体感
Matroid 这类笔试,题面不长,但模拟细节多,窗口、反弹、连通段一处没对齐就容易WA。与其卡在边界上反复改,不如先把高频实现套路过熟,再上正式场。
最近如果也在准备 Matroid 或相近平台的 OA,需要题型对照、思路核对,或希望有人帮着把关实现细节,可以看看 InterviewShow。OA 辅助和 VO 支持都有,按自己的安排来就行。
祝顺利过线。