TikTok VO 面试经验分享:Alien Dictionary 外星词典 BFS题 - Oavoservice

TikTok SDE 0820 面经 VO
Candidate 在 TikTok VO coding 环节遇到了经典题 —— Alien Dictionary 外星词典。
今天面试官是一个华人小哥,看起来比较和谐,先是双方自我介绍,然后直接就是 Coding,上来就出一道字节题库里的经典 BFS 题。
题目描述
有一种使用英语字母表的外星语言,但字母顺序不同。给定一个由该外星语言单词组成的列表,且这些单词已经按照这种新语言的字母顺序排序完成。你需要推导出这种语言可能的字母顺序,即字符的排列顺序。如果存在多种可能的顺序,返回其中任意一种即可。如果输入无效,例如排序规则自相矛盾,则返回空字符串。
Follow up
如果有多种合法的字母顺序,要求返回字典序最小的那一个怎么办?
解题思路
这是一道经典的拓扑排序问题,可以使用 BFS 来解决:
- 构建图:通过比较相邻单词,找出字符之间的相对顺序关系
- 计算入度:统计每个字符的入度
- BFS 拓扑排序:从入度为0的字符开始,逐步构建字母顺序
- 检测环:如果最终结果包含所有字符,说明无环;否则存在矛盾
代码实现
from collections import defaultdict, deque
def alienOrder(words):
# 构建图和入度
graph = defaultdict(set)
in_degree = defaultdict(int)
# 初始化所有字符的入度为0
for word in words:
for char in word:
in_degree[char] = 0
# 通过比较相邻单词构建图
for i in range(len(words) - 1):
word1, word2 = words[i], words[i + 1]
min_len = min(len(word1), len(word2))
# 检查前缀情况
if len(word1) > len(word2) and word1[:min_len] == word2[:min_len]:
return "" # 无效输入
# 找到第一个不同的字符
for j in range(min_len):
if word1[j] != word2[j]:
if word2[j] not in graph[word1[j]]:
graph[word1[j]].add(word2[j])
in_degree[word2[j]] += 1
break
# BFS 拓扑排序
queue = deque([char for char in in_degree if in_degree[char] == 0])
result = []
while queue:
char = queue.popleft()
result.append(char)
for neighbor in graph[char]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
# 检查是否所有字符都被包含
return ''.join(result) if len(result) == len(in_degree) else ""
Follow up 解决方案
对于要求返回字典序最小的字母顺序,可以把拓扑排序的队列换成 priority queue:
import heapq
def alienOrderLexicographicallySmallest(words):
# 构建图和入度(同上)
graph = defaultdict(set)
in_degree = defaultdict(int)
for word in words:
for char in word:
in_degree[char] = 0
for i in range(len(words) - 1):
word1, word2 = words[i], words[i + 1]
min_len = min(len(word1), len(word2))
if len(word1) > len(word2) and word1[:min_len] == word2[:min_len]:
return ""
for j in range(min_len):
if word1[j] != word2[j]:
if word2[j] not in graph[word1[j]]:
graph[word1[j]].add(word2[j])
in_degree[word2[j]] += 1
break
# 使用优先队列保证字典序最小
heap = [char for char in in_degree if in_degree[char] == 0]
heapq.heapify(heap)
result = []
while heap:
char = heapq.heappop(heap)
result.append(char)
for neighbor in graph[char]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
heapq.heappush(heap, neighbor)
return ''.join(result) if len(result) == len(in_degree) else ""
算法分析
- 时间复杂度:O(C),其中 C 是所有单词中字符的总数
- 空间复杂度:O(1),因为最多只有26个英文字母
- 核心思想:拓扑排序 + BFS,通过字符间的相对顺序构建有向无环图
测试用例
# 测试代码
words1 = ["wrt", "wrf", "er", "ett", "rftt"]
result1 = alienOrder(words1)
print(f"Example 1: {result1}") # 输出: "wertf"
words2 = ["z", "x"]
result2 = alienOrder(words2)
print(f"Example 2: {result2}") # 输出: "zx"
words3 = ["z", "x", "z"]
result3 = alienOrder(words3)
print(f"Example 3: {result3}") # 输出: "" (无效输入)
面试官看完直接点头:"Great solution! The topological sort approach is optimal."
Candidate 成功拿下这一轮。
这就是 OAVOSERVICE 实时 VO 辅助 的威力:
不是死记硬背题库,而是帮你在最关键的时刻,快速理清思路,稳定发挥,稳稳过关!
面试技巧分享
在 TikTok 的 VO 面试中,除了算法实现,面试官还会关注:
1. 问题建模能力
能够快速识别出这是一道拓扑排序问题,将字符串比较转化为图论问题。
2. 边界条件处理
考虑各种边界情况,如无效输入、环检测、前缀情况等。
3. 代码实现质量
写出清晰、高效的代码,注意变量命名和代码结构。
4. Follow up 思维
能够灵活应对面试官的追问,如字典序最小化等变种问题。
Oavoservice 实时辅助服务
在这次 TikTok VO 面试中,我们的实时辅助系统发挥了关键作用:
- 快速思路提示:在候选人卡壳时,立即提供拓扑排序的核心思路
- 算法指导:推荐使用 BFS 来实现拓扑排序算法
- 代码优化:提供最优的代码实现,确保时间和空间复杂度
- Follow up 支持:帮助候选人应对字典序最小化等进阶问题
结语
Alien Dictionary 虽然是一道经典题目,但在面试的紧张环境下,能够快速理清思路并正确实现并不容易。这就是为什么我们的实时辅助服务如此重要。
如果你正在准备 TikTok 或其他公司的技术面试,欢迎联系 Oavoservice。我们拥有丰富的面试经验和专业的辅助团队,能够在你最需要的时候提供及时有效的帮助。
Oavoservice - 让每一次面试都成为成功的机会!
需要辅助的同学随时dd哦,vo开始前支持mock!