TikTok 一亩三分地 | TikTok 26 NG 真题解析与面试过程

1,428次閱讀

最新 TikTok 面经来了,一起看下这波真实流程分享~( tiktok 一亩三分地 同款节奏)。这次 TikTok 面试一共三轮,整体偏硬核。前两轮都是纯 coding 面,每一轮两道算法题,时间卡得比较紧,考察重点在思路清晰度和代码完整性。题型以中高频算法为主,需要对复杂度和边界情况比较敏感。
第三轮是 HM 面,先从简历深挖项目经历,重点问了 infra 相关背景,比如系统设计思路、技术选型以及实际落地情况。Behavior 部分主要围绕一个核心项目展开,follow up 追问项目中遇到的困难以及你是如何解决的。最后的 coding 是一道偏 DP 的题目,整体难度不低,但非常符合 TikTok 的实际用人风格。

Tiktok SDE NG 第一轮

Coding 1: 修改元素判断数组是否有序

在允许最多修改数组的一个元素的条件下,这个数组是否是有序的。
考虑从前往后遍历数组,将遇到不满足有序条件的元素nums[i],即nums[i] < nums[i-1],若i为size-1即最后一个元素,或者数组已经全部有序,直接返回true,否则应考虑nums[i+1]的大小:

  • 若nums[i+1] >= nums[i-1],如数组0,1,2,【1】,3… 中 3 > 2,此时i+1及之前的元素满足题意条件,若后面是有序的则返回true;
  • 否则,如数组0,1,4,【1】,3…中 3 < 4,则若将nums[i-1]改成nums[i],再从i-2开始遍历数组判断其是否有序的即可。

时间复杂度O(n), 空间复杂度O(1)

思路

  1. 遍历数组,找到第一个违反非递减顺序的位置i(即nums[i] < nums[i-1])。
  2. 如果i已经遍历到数组的末尾或倒数第二个元素,说明最多只有一个元素违反顺序,可以通过修改这个元素来修复,直接返回true
  3. 检查是否可以通过修改nums[i-1]nums[i]来修复数组。
  4. 从位置i开始,继续向后遍历数组,检查是否所有元素都满足非递减顺序。如果发现任何违反顺序的元素,则返回false
  5. 如果整个数组都满足非递减顺序,则返回true

Coding 2: 距离最小的节点

找到树中到其他节点的平均距离最小的节点,一个edge距离算1,要求时间复杂度为O(n)。 参考

思路

  1. 首先,定义一个标志变量visited,用来标记是否已经找到目标节点p,初始值为false
  2. 定义一个空栈stack,用来存储从根节点到目标节点p的路径上的节点值。
  3. 定义一个函数getDisToPar,接收三个参数:当前节点root、目标节点p和用于存储路径的栈stack
  4. getDisToPar函数中,首先检查当前节点是否为空,如果为空,则直接返回。
  5. 将当前节点的值添加到栈中。
  6. 如果当前节点就是目标节点p,并且之前没有访问过(visitedfalse),则将visited标记为true,并返回。
  7. 如果目标节点p还没有找到,先递归地在左子树中查找。
  8. 如果左子树中没有找到,再递归地在右子树中查找。
  9. 如果当前节点的左右子树都没有找到目标节点p,说明当前节点不在目标节点p的路径上,将其从栈中弹出。
  10. 栈中存储的就是从根节点到目标节点p的路径上的节点值。

Tiktok SDE NG 第二轮

这轮面试官是西雅图的白人小姐姐,先2分钟闲聊,问最近做的项目里“怎么优化了数据库查询性能”,然后直接进Coding。

Coding 1

Q1:给定一个嵌套的整数列表(每个元素是整数或嵌套列表),实现一个迭代器,按顺序遍历所有整数。 (类似LeetCode 341,但要求自己定义数据结构+实现 next() 和 hasNext() )

思路:先clarify了“嵌套列表的输入格式”(小姐姐说用Python的 List[Union[int, List]] ),用栈逆序压入初始元素, hasNext() 时循环弹出栈顶元素,若为列表则继续逆序压入其元素,直到栈顶是整数。边写边覆盖了“空嵌套列表”“多层嵌套”的用例,小姐姐追问了“时间复杂度为什么是均摊O(1)”。

class NestedIterator:
    def __init__(self, nestedList):
        # Initialize by pushing the list onto the stack in reverse order.
        # The top of the stack is always the next element to process.
        self.stack = nestedList[::-1]
    def next(self) -> int:
        # hasNext() guarantees the top of the stack is an integer, so we just pop it.
        return self.stack.pop()
    def hasNext(self) -> bool:
        # Loop until the stack top is an integer or the stack is empty
        while self.stack:
            top = self.stack[-1]
            
            # Case 1: Top is an integer. We found the next element.
            if isinstance(top, int):
                return True
            
            # Case 2: Top is a list. Pop it and push its contents back in reverse order.
            # Example: top = [1, 2] -> Pop it -> Push 2, then 1.
            top_list = self.stack.pop()
            self.stack.extend(top_list[::-1])
            
        return False
# --- Test Case ---
# Input: [[1,1], 2, [1,1]]
# Expected Output: [1, 1, 2, 1, 1]
nested_list = [[1, 1], 2, [1, 1]]
iterator = NestedIterator(nested_list)
result = []
while iterator.hasNext():
    result.append(iterator.next())
print(result) # Output: [1, 1, 2, 1, 1]

Coding 2

Q2:给定一个字符串数组,将字母异位词组合在一起(要求:时间复杂度优于O(nk log k),k是字符串最大长度)。

思路:常规解法是排序字符串当key,但面试官要求优化排序的O(k log k)。用计数数组转tuple当key(比如“aab”转 (2,1,0,…,0) ),这样每个字符串的处理是O(k)。写的时候小姐姐提示“可以用质数乘积当key吗?”,后面补充了“质数乘积可能溢出,计数数组更安全”,最后代码过了所有测试用例(包括空字符串、单个字符的情况)。 面完小姐姐加了句“你的计数数组思路比排序更贴合生产场景”

from collections import defaultdict
from typing import List
def groupAnagrams(strs: List[str]) -> List[List[str]]:
    # Use defaultdict to handle missing keys automatically
    anagram_map = defaultdict(list)
    
    for s in strs:
        # Initialize a count array for 26 lowercase letters
        # count looks like: [2, 1, 0, ..., 0] for "aab..."
        count = [0] * 26
        
        for char in s:
            # Map char to index 0-25 using ASCII values
            count[ord(char) - ord('a')] += 1
        
        # Convert the list to a tuple to use it as a dictionary key
        # Time Complexity: O(K), where K is the length of the string
        key = tuple(count)
        
        anagram_map[key].append(s)
        
    return list(anagram_map.values())
# --- Test Case ---
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
print(groupAnagrams(strs))
# Possible Output: [['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]

Tiktok SDE NG 第三轮HM

HM面这一轮很重要,面试官有决定权,每个面试官风格也不一样,经验来说还是根据前两轮面的不好的地方来准备。 这次是全程围绕简历展开,感觉面试官更加关注沟通和成长性。

首先先是自我介绍,接着挑了几个项目提问,也会问在团队中是否愿意主动承担责任,是否愿意快速学习新系统之类的。

重点问了:1、问了最有挑战性的项目。2、如何与队友协作。3、遇到突发情况如何处理 就简单分享一个实习经历,然后因为什么导致失败,最后又怎么样解决避免再次出错,回答的时候要圆的回来,一些技术细节也要了解到位,一般没啥问题 这次并没有问coding,算正常聊天那种,从你的回答表现来决定是否合适

联系我们|把面试不确定性,变成可控结果

在真实的面试过程中,很多卡点并不在“会不会写”,而在能不能在有限时间内,把思路讲清楚、把关键点答到位。通过我们的全流程面试辅助与 OA 支持,学员不仅顺利完成了题目,更在沟通中清晰展示了自己的逻辑能力、问题拆解能力和工程思维,让面试官真正看到“可落地的实力”。

无论是 TikTok 的高强度 coding,还是 follow-up、项目深挖,我们的实时助攻都能在关键时刻帮你稳住节奏、补齐要点。这种能力的提升,不只服务于一次面试,也会长期反哺你解决真实工程问题的方式。

如果你也正在准备 TikTok / 大厂 OA 或 VO,希望在关键面试中更稳、更有把握,欢迎立即联系我们,一起把机会握在自己手里。

推荐阅读:

TikTok 一亩三分地 | TikTok MLE Intern VO 网友都说不难

Tiktok DE 三轮 VO 超详细面经|技术深挖 + 建模推导 + 压力节奏全记录

author avatar
Jack Xu MLE | 微软人工智能技术人员
Princeton University博士,人在海外,曾在谷歌、苹果等多家大厂工作。深度学习NLP方向拥有多篇SCI,机器学习方向拥有Github千星⭐️项目。
正文完