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

1,429Views

最新 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千星⭐️專案。
END