‹ 全部面经
TikTok OA 四题 AC:区间最小值、元音差排序、反弹对角线、至少 k 对水果的子数组
TikTok OA 四题 AC 复盘:开区间内最小值、按元音辅音个数差排序单词、反弹对角线权重排序、滑动窗口统计至少包含 k 对相同水果的子数组个数,附 Python 参考代码。
OA
第一题:开区间内的最小值
筛选出满足 nRange[0] < x < nRange[1] 的元素,取其中的最小值;没有符合条件的元素就返回 0。
def min_in_open_range(nums, n_range):
lo, hi = n_range
return min((x for x in nums if lo < x < hi), default=0)
第二题:按元音差排序单词
统计每个单词里元音字母的个数 v,计算 |v − (单词长度 − v)|,按这个差值升序排序,差值相同时按字典序排列。
def sort_by_vowel_gap(words):
def gap(w):
v = sum(ch in "aeiouAEIOU" for ch in w)
return abs(v - (len(w) - v))
return sorted(words, key=lambda w: (gap(w), w))
第三题:反弹对角线权重排序
对第一列的每个元素,从 (r, 0) 沿着反弹对角线遍历,路径的行号是 abs(r − c),累加得到权重;最后按 (权重, 元素值) 排序。
详细思路和代码见 10.2 TikTok 27 Intern OA 面经 第 3 题。
第四题:至少包含 k 对水果的子数组个数
用滑动窗口维护窗口内各种水果的频次,同时维护配对数 sum(freq // 2):
- 右边界不断向右扩展。
- 当窗口满足「至少 k 对」时收缩左边界。
- 统计所有以当前右边界结尾的合法子数组个数。
from collections import defaultdict
def count_subarrays_with_k_pairs(fruits, k):
freq, pairs, left, total = defaultdict(int), 0, 0, 0
for x in fruits:
freq[x] += 1
if freq[x] % 2 == 0:
pairs += 1 # 新凑成一对
while pairs >= k: # [left..right] 合法,左边界右移
y = fruits[left]
if freq[y] % 2 == 0:
pairs -= 1
freq[y] -= 1
left += 1
total += left # 起点 0..left-1 都合法
return total
时间 O(n)。关键点:窗口越大配对数只增不减,所以「合法」关于左边界是单调的,可以用双指针。