Visa OA 面经|矩阵改成 Y,数轴上的方块能不能放

Visa OA 面试备考文章封面

Visa 的一份 2024 年 9 月校园招聘记录里,CodeSignal 给了 70 分钟、四道编程题。这里细讲其中描述完整的第 1 题和第 3 题:一道要把矩阵改成字母 Y,另一道要判断指定位置能否放下方块。两题都要先把范围写准,错误经常出在中心点和区间端点上。

这份校园批次与美国岗位的测评安排要分开看。加州 SDE Intern 候选人的记录描述的是 2021 年申请后收到两题 HackerRank;Taro 上另一位美国候选人也提到两题 HackerRank。准备当次考试时,以邀请邮件里的平台和题量为准,别把不同批次拼成同一套卷子。

第一题:把矩阵改成字母 Y

题目描述

输入是边长为奇数的方阵,元素只取 0、1、2。Y 的两条斜臂从上方两个角延伸到中心,竖干从中心向下。选择一种值填满 Y,再选另一种值填满背景,求最少要修改多少个格子。Y 和背景的值必须不同。

下面用自拟的 3×3 例子手算:三行分别为 [0,2,0][2,1,2][2,1,2]。Y 上共有四格,其中两个 0、两个 1;其余五格都是 2。把 Y 全部改成 0 或全部改成 1 都只需两次修改,答案是 2。

解题思路

设中心下标为 mid = n // 2,行列下标从 0 开始。上半部分只接纳两条斜臂,下半部分只接纳中间一列。把中心行交给竖干处理,条件就能写成:

is_y = (r < mid and (c == r or c == n - 1 - r)) or (r >= mid and c == mid)

遍历矩阵,分别统计 Y 内和背景中 0、1、2 的数量,得到 inside[3]outside[3]。假设 Y 使用值 a、背景使用值 b,修改次数就是 Y格数 - inside[a] + 背景格数 - outside[b]。枚举 a、b 且排除 a == b,一共六种方案,取最小值即可。

不能各自挑出现最多的值后直接相加:两个区域的最多值会撞在一起。例如 Y 和背景都以 0 为主时,这种做法得到的方案违反题意。六次枚举的成本很小,也更容易检查。

中心格只计一次;Y 的斜臂在中心以下不能继续伸到左右下角。写完分类条件后,用 3×3 和 5×5 各画一张图,逐格对照。复杂度:时间 O(n²),额外空间 O(1)。

第三题:指定区间里有没有障碍物

题目描述

操作有两类:[1,x] 在整数坐标 x 放置障碍;[2,x,size] 检查一个长度为 size、末格为 x-1 的方块能否放下。将每次查询结果拼成二进制字符串。

按这个描述,待检查的整数坐标范围是 [x-size,x-1],也可写成半开区间 [x-size,x)。这里采用“被占用的整数格不能覆盖”的规则;这与“在 x 左边任意找一段空位”的另一类放块题不同。

自拟练习:先在 4 和 10 放障碍。查询 [2,10,5] 检查 5 到 9,返回 1;查询 [2,10,6] 检查 4 到 9,返回 0;查询 [2,11,1] 只检查 10,返回 0。拼接结果为 100。障碍恰在 x 上不影响以 x-1 结束的方块。

解题思路

维护一个有序障碍集合。查询时找到严格小于 x 的最大障碍 p:如果它存在且 p >= x-size,方块会碰到障碍;否则整个目标区间都为空。只查一个前驱就足够,因为其余小于 x 的障碍都在 p 左边。

C++ 可以对 set 调用 lower_bound(x),迭代器前移之前先判断是否等于 begin()。Java 可用 TreeSet.lower(x)。重复插入同一坐标不会增加障碍数量。每次操作都是 O(log q),q 为操作数。

Python 的排序列表加 bisect 能迅速写出基准解,但插入仍需搬移元素,最坏是 O(q²) 总时间。操作数较大时,可以先收集所有插入坐标做离散化,再用 Fenwick Tree 维护已占用点数。查询区间内的计数为零就能放。离散化只替换索引;判断区间范围时仍用原坐标,不能拿压缩后下标的差代替方块长度。

这一题无需维护全局最大空隙。每次查询已经固定了方块末端,维护障碍位置足够。若题目改成“任意位置放块”,才需要重新设计查询内容。

Visa OA 做题顺序怎么安排

这份四题记录还提到了按学生姓名聚合成绩,以及另一种 Y 形定义。成绩题可以用总分和次数计算平均值;并列规则要读题确认。另一种 Y 的几何定义没有完整展开,因此这里不替它补题面。

练习时先完成能给出明确边界的题,再做复杂实现。矩阵题保留六种颜色组合的手算表;数轴题至少测无障碍、左端有障碍、右端 x 有障碍和重复插入。最后留几分钟检查函数签名、输出顺序和空集合分支。

FAQ

矩阵题需要 BFS 或 DFS 吗?

Y 的位置由坐标直接决定,不需要搜索连通区域。每个格子判断一次归属即可。

方块长度很大,能逐格扫描吗?

不要让运行时间跟坐标跨度绑定。查询障碍前驱或区间内的障碍数量,都不需要扫描每个整数坐标。

可以用 CodeSignal 分数判断一定能进下一轮吗?

分数只描述本次测评表现。两位美国候选人的后续结果不同,不能据此推导统一录取线;流程状态以招聘方通知为准。

参考来源

关于 CSINTERVIEWHELP

准备 Visa OA 时,可以找 CSINTERVIEWHELP 做限时模拟和解题复盘,把矩阵判断、二分查询以及边界测试练熟。无论是 OA 题型解析、OA 备考辅导、VO 模拟面试、VO 面试陪练还是系统设计训练,都可以按目标岗位安排练习:CSINTERVIEWHELP · 服务详情