Tiktok Intern OA 又发了一批,我这场点进去就很眼熟,感觉题面见过类似的,下手快了不少:前两题偏 Easy,第三题矩阵实现,第四题带更新的计数思维题。CodeSignal 的题库复用率不低,老题仍可能原题出现。这场第二、第四题之前就见过类似写法。

Question 1:矩阵 k-border 排序后顺时针写回

题意
给一个 n×n 矩阵,最外圈叫 0-border,去掉最外圈之后新的外圈叫 1-border,以此类推,一共到 floor((n-1)/2) 层。对每一圈:把这一圈的元素取出来、排序、从左上角开始按顺时针放回原位。题面允许 O(n³),不用卡最优。
思路
按层做,每一层算出 top / bottom / left / right 四条边的边界,按”上→右→下→左”的顺序收集元素,sort 之后再按同样顺序写回。
四个角只在一侧计入,不重复取。具体来说:上行取 [left, right],右列取 [top+1, bottom],下行取 [right-1, left-1](反向),左列取 [bottom-1, top](反向)。
最容易翻车的地方就是下行和左列都是反向遍历,顺序别搞混——建议写一个 helper 先验证单层的取法对不对,再套外层循环。
Question 2:拆房子后还剩几段

题意
数轴上有若干房子,位置在 houses 里互不相同。queries 是按顺序给出的拆除位置,每次拆完问当前还剩多少个”段”。段的定义:连续相邻的房子形成一段,单独一栋也算一段。
示例:houses = [1,2,3,6,7,9],queries = [6,3,7,2,9,1],输出 [3,3,2,2,1,0]。
思路
正着维护连通段数。用一个集合存当前还在的房子,拆 x 的时候看左右邻居:
左右都在——x 在某段中间,拆掉之后左右各成一段,段数 +1。
只有一侧有邻居——x 在某段的端点,拆掉之后那段缩短但不分裂,段数不变。
左右都没有——x 是孤立的一栋,拆掉直接少一段,段数 -1。
初始化时先根据全部 houses 算好初始段数(相邻元素之差 > 1 就是一个分界),再按 queries 顺序逐个更新、逐次记录。
这题最容易漏的坑:初始段数没算对。建议先排序 houses,扫一遍数相邻差 > 1 的地方有几个,初始段数 = 1 + 这些分界的数量。
Question 3:矩阵 k-border 顺时针排序

题意
给定 n × m 矩阵。定义 0-border 为最外圈(最左列、最右列、最上行、最下行的并集);去掉 0-border 后,新的最外圈是 1-border,以此类推直到中心。
对每个合法的 k,将该 k-border 上的元素排序后,再按顺时针、从左上角开始写回该圈。
题面允许时间复杂度不超过 O(n⋅m⋅(n+m))。
解题思路
- 计算层数:大约 min(n,m)//2 层。
- 对每一层 k:按顺时针顺序收集该圈元素(上 → 右 → 下 → 左,注意拐角不要重复)。
- 将收集到的列表排序。
- 再按同样顺时针顺序写回矩阵。
实现时注意:当某一层退化成一行或一列时,不要重复遍历边;下标与 k 的对应关系要和题图一致。
Question 4:带更新的两数之和查询

题意
给定数组 a、b,以及若干 queries。每条查询两种形式:
- [0, i, x]:把 a[i] 赋值为 x
- [1, x]:统计有多少对下标 (i, j) 满足 a[i] + b[j] = x
按顺序处理所有查询,返回所有类型 [1, x] 的结果组成的数组。
示例:a=[3,4],b=[1,2,3],queries=[[1,5],[0,0,1],[1,5]] → [2,1]。
解题思路
维护 b 的频次表(哈希表:值 → 出现次数)。 对类型 [1, x]:遍历当前 a 的每个元素 v,累加 freq[x – v],即为答案。 对类型 [0, i, x]:只需改 a[i],b 的频次表不变。
若 a 很长、查询很多,遍历 a 可能偏慢,可再维护 a 的频次,更新时对 a 的旧值减 1、新值加 1,查询时枚举较短的一边;题面规模通常允许简单写法先过。
注意:只返回类型 [1, x] 的结果,更新操作不进答案数组。
说一句
TT 的 OA 时间紧、题有梯度,建议先扫全卷再动手,简单的先拿分,别卡在一道细节上。有在备考 TikTok 或其他公司 OA 的同学,可以来找我们聊。 InterviewShow 整理了 TikTok 和 CodeSignal 同类公司的高频题库,按目标公司给针对性刷题清单,一对一跟着走。有需要的来聊。