目录
正在加载目录...

TikTok SDE OA 新鲜面经|四题25分钟完整解析

这次分享的是一场 TikTok SDE OA,共 4 道 Coding 题,限时约 25 分钟。题目整体以常见算法题型为主,包括区间处理、字符串排序、矩阵旋转和 Sliding Window,整体难度不算高,但对解题速度和熟练度要求比较高。

这次题目整体偏算法实现,涉及 Difference Array、Prefix Sum、Sorting、Matrix Rotation、Sliding Window 等常见题型。对于平时刷过类似题目的候选人来说,题目本身并不陌生,但 OA 时间比较紧,能不能快速识别题型并直接套用熟悉的解题框架非常重要。

下面按照这次 OA 的题目顺序,整理四道题的主要思路,方便准备 TikTok SDE OA 的同学提前熟悉题型。

TikTok SDE OA 四道题概览

题目主要题型核心方法
Q1区间覆盖 / 查询Difference Array + Prefix Sum
Q2字符串 / 排序Counting + Sorting
Q3矩阵操作Matrix Rotation
Q4子数组 / 计数Sliding Window + Hash Map

这四道题的共同特点是:并不一定需要非常复杂的算法,但需要快速判断题目的核心数据结构和操作方式。

Q1:区间照明与查询

TikTok SDE OA 新鲜面经|四题25分钟完整解析

题目思路

第一题可以理解为一个典型的 区间覆盖 + 查询 问题。有若干个灯光覆盖区间,每个区间会照亮一段连续的数轴范围。随后给出若干查询点,需要判断每个位置被多少个灯照亮。

如果直接遍历每个灯光区间,再把区间中的每个位置逐个加一,在数据规模较大的情况下效率会比较低。这类题比较典型的做法就是 Difference Array(差分数组)+ Prefix Sum(前缀和)。

解题方法

假设一个灯光覆盖区间为:[l, r] 不需要把整个区间全部加一,只需要修改两个位置:

diff[l] += 1
diff[r + 1] -= 1

所有区间处理完成后,再从左到右计算 Prefix Sum。例如:

位置:    1  2  3  4  5
diff:   +1  0  0 -1  0

进行前缀累加之后,就可以得到每个位置实际被多少个区间覆盖。因此,查询某个位置时,直接读取对应的前缀和即可。

这道题考什么?

这道题的核心不是复杂的数据结构,而是能不能快速识别出:多个区间更新 + 多个位置查询 → Difference Array + Prefix Sum如果每次都直接修改整个区间,很容易在 OA 中浪费大量时间。

需要注意

实现时尤其注意:

  • 区间是否包含左右端点
  • r + 1 是否超出数组范围
  • 查询点是否一定在给定范围内
  • 坐标范围是否很大

如果数轴范围非常大,也需要根据题目的数据范围考虑是否需要坐标压缩。

Q2:按照元音数量与辅音数量排序单词

TikTok SDE OA 新鲜面经|四题25分钟完整解析

题目思路

第二题是一个比较典型的 字符串统计 + 自定义排序 问题。对于每个单词,首先统计其中有多少个元音。假设:

v = 元音数量
len = 单词长度

那么辅音数量就是:len – v 题目要求计算:|v – (len – v)| 也就是元音数量和辅音数量之间的差值。 之后按照两个规则排序:

  1. 首先按照差值从小到大排序
  2. 如果差值相同,再按照字典序排序

解题方法

可以为每个单词建立一个排序 key:(difference, word) 其中:difference = abs(v – (len – v))

例如有:

apple
banana
orange

分别计算每个单词的元音数量和差值,然后按照:(difference, word) 进行排序即可。

为什么这样做?

这类题非常适合直接使用 custom sorting。与其写很多层 if/else 判断两个单词谁应该排在前面,不如把题目的排序规则直接转换成一个 tuple。

例如:key = (difference, word) 语言本身的排序机制就可以自动完成:

先比较 difference
↓
difference 相同
↓
再比较 word

这道题的核心考点

主要包括:

  • String Traversal
  • Character Counting
  • Absolute Difference
  • Custom Sorting
  • Lexicographical Order

题目本身不复杂,真正需要注意的是不要把两个排序条件的优先级写反。

Q3:矩阵四区域旋转

TikTok SDE OA 新鲜面经|四题25分钟完整解析

题目思路

第三题是这次 OA 中比较容易卡实现细节的一道。给定一个矩阵,矩阵中的两条主对角线元素保持不变。两条对角线会把矩阵划分成四个区域,每次操作都需要将这四个区域按照顺时针方向进行轮换。如果需要旋转多次,题目还会给出一个 turns 参数。

关键观察:旋转4次等于没有变化

四个区域进行轮换,本质上是一个长度为 4 的循环。因此:turns % 4 可以直接消除重复操作。

例如:

turns = 1 → 旋转一次
turns = 2 → 旋转两次
turns = 3 → 旋转三次
turns = 4 → 等于不旋转
turns = 5 → 等于旋转一次

所以实际需要执行的次数是:turns % 4

解题方法

首先明确矩阵中的四个区域:

     主对角线
       \   /
        \ /
   区域 1 | 区域 2
   -------+-------
   区域 3 | 区域 4
        / \
       /   \
     副对角线

两条对角线上的元素不参与区域交换。每次旋转时,只需要按照顺时针方向完成四块区域的数据交换。可以把四个区域看成:

A → B
B → C
C → D
D → A

为了避免覆盖原始数据,需要使用临时变量或者临时数组保存其中一块内容。

这道题最容易出错的地方

矩阵题通常不是算法想不到,而是下标容易写错。尤其需要注意:

  • 两条对角线不能移动
  • 四个区域边界是否包含
  • 奇数矩阵中心点属于哪部分
  • 旋转方向不能搞反
  • 多次旋转可以先 turns % 4

如果时间比较紧,建议先在一个很小的矩阵上手动验证一次旋转结果,再开始正式提交。

Q4:至少 K 对水果的连续子数组

TikTok SDE OA 新鲜面经|四题25分钟完整解析

题目思路

题目可以理解为给定一个水果数组,需要找到满足条件的连续子数组。对于每一种水果,如果它出现了 freq 次,那么可以组成:freq // 2 对水果。

例如:apple 出现 5 次,那么可以组成:5 // 2 = 2 对,因此,可以维护当前窗口内所有水果能够组成的 pair 数量:sum(freq // 2),当窗口中已经至少有 k 对水果时,就说明当前窗口满足条件。

Sliding Window 怎么做?

定义两个指针:

left
right

右指针不断向右扩张窗口。每加入一个水果:freq[fruit] += 1 同时更新当前窗口能够组成的 pair 数量。当:sum(freq // 2) >= k,说明当前窗口已经满足条件。这时候开始移动 left,尽可能缩小窗口。

为什么可以用滑动窗口?

因为随着 right 不断向右移动,窗口中的元素只会增加。当窗口第一次满足:pairs >= k,之后,如果继续向左移动 left,就可以找到更多满足条件的起点。

假设当前 right 固定,经过收缩之后:[left … right] 已经是满足条件的最小窗口。那么比 left 更靠左的所有起点,也都会形成满足条件的子数组。因此可以一次性累计合法子数组数量,而不需要枚举所有子数组。

一个简单的例子

假设当前窗口为:apple apple banana banana orange

那么:

apple → 2 个 → 1 对
banana → 2 个 → 1 对
orange → 1 个 → 0 对

因此:sum(freq // 2) = 2 如果题目要求:k = 2,那么当前窗口已经满足条件。接下来就可以移动 left,寻找更短的合法窗口。

这道题的核心考点

这道题主要考察:

  • Sliding Window
  • Hash Map / Frequency Map
  • Frequency Counting
  • Two Pointers
  • Subarray Counting

其中最关键的是理解:sum(freq // 2),为什么能够表示当前窗口中可以组成多少对。如果每次窗口变化都重新遍历所有水果计算 pair 数量,效率会比较低。更好的方法是随着元素加入和移除,动态维护这个值。

TikTok SDE OA 这四道题考了什么?

从这次 OA 的四道题来看,题型覆盖面比较广,但每道题都有比较明确的解题模板。

1. 区间问题

Q1 对应:Difference Array + Prefix Sum 看到大量区间更新和位置查询时,可以优先考虑差分数组。

2. 字符串与排序

Q2 对应:Counting + Custom Sorting 先把题目中的排序条件转化成一个可以比较的 key,再直接排序。

3. 矩阵模拟

Q3 对应:Matrix Manipulation + Cyclic Rotation 重点不是复杂算法,而是正确处理矩阵边界、对角线和区域映射。

4. 连续子数组

Q4 对应:Sliding Window + Frequency Map 当题目要求连续子数组,并且窗口满足某个可以动态维护的条件时,可以考虑滑动窗口。

TikTok SDE OA 备考建议

这次 OA 一个比较明显的特点是 题目本身不一定特别难,但时间非常重要。如果四道题需要在 25 分钟左右完成,那么平均每道题只有几分钟。这种情况下,与其遇到题目之后从零开始推导,不如提前把常见模板练熟。

Difference Array

需要熟悉:

diff[l] += 1
diff[r + 1] -= 1

以及之后的 Prefix Sum。

Sorting

需要熟悉:key = (primary_condition, secondary_condition)这种多条件排序方式。

Matrix

需要熟悉:

  • 矩阵边界
  • 顺时针 / 逆时针旋转
  • 四块区域交换
  • 对角线处理
  • turns % 4

Sliding Window

需要熟悉:

right 扩张
↓
维护窗口状态
↓
满足条件
↓
left 收缩
↓
累计答案

尤其是 “满足条件之后如何累计答案”,这是很多 Sliding Window 题最容易漏掉的部分。

TikTok SDE OA 备考建议

这次 OA 的四道题分别对应几种常见 Coding 模板:

  • Q1:Difference Array + Prefix Sum:适用于区间更新与位置查询
  • Q2:Counting + Custom Sorting:适用于字符串统计和多条件排序
  • Q3:Matrix Manipulation + Simulation:重点处理矩阵边界、区域交换和旋转方向
  • Q4:Sliding Window + Frequency Map:适用于连续子数组和动态计数

如果 OA 时间只有 25 分钟左右,熟悉这些基础模板可以减少从零分析的时间。除了掌握算法本身,也需要注意 Edge Cases、时间复杂度以及实现细节,尤其是矩阵下标和 Sliding Window 的窗口收缩逻辑。

如果你还需要针对 OA、VO 或 Coding 的专项准备,也可以了解 InterviewShow 的一对一面试辅导,结合具体面试环节进行准备。

祝面试顺利。

END