← 返回部落格列表 Amazon Applied Scientist 面試全流程複盤:五輪 Loop + LP
Amazon

Amazon Applied Scientist 面試全流程複盤:五輪 Loop + LP

2026-08-14

Amazon 的 Applied Scientist(AS)職位面試有個鮮明特點:幾乎每一輪都會插入 Leadership Principles(LP)行為題,光靠刷題和啃機器學習理論是不夠的,必須提前打磨幾個能被隨意深挖細節、追問到底的真實專案故事。下面按流程拆解各輪考察重點,L4/L5/L6 在行為面試上的權重差異也會一併說明,其他職位方向同樣能參考。需要 VO輔助 或 VO代面 的同學,也可以照著這份複盤對齊節奏。

AS 面試流程概覽

階段 時長 / 形式 核心考察
電話面 45–60 分鐘 一道 LeetCode 難度演算法 + ML 基礎問答 + 1–2 道 LP
Onsite 第一輪 Coding + LP 資料處理題(雜湊表 + 手寫堆)+ 業務開放題
Onsite 第二輪 Case Study + LP 最佳化理論手寫 + 作業研究建模 + 系統設計
Onsite 第三輪 純 Coding + Ownership OOD 物件導向設計
Onsite 第四輪 ML Application + LP ML 系統設計(HM 主持)
Onsite 第五輪 Bar Raiser Leadership Principles 總攻

一個貫穿始終的規律:每一輪基本都會留出約 15 分鐘問一到兩個行為題,所以 LP 準備絕不能只壓到最後一輪。


電話面:演算法 + ML 基礎的組合拳

Phone Screen 是進 Onsite 的門檻,通不過 Recruiter 就不會繼續排後面的 Loop。這一輪的配方通常是:一道 LeetCode 難度的演算法題,加機器學習基礎知識問答,外加一兩個 LP 行為題當調味。

面試官往往會順著履歷專案往深處挖,常見考點包括:

真正拉開差距的是這道情境選擇題:給定不同的分類任務,Logistic Regression、Decision Tree、Random Forest、DNN 該怎麼挑?光背模型特點不夠,還得結合資料量、特徵類型、非線性程度、可解釋性要求和推論成本這幾個維度綜合判斷,講出取捨邏輯才算過關。

BQ 環節固定兩道,且都會被繼續往技術細節裡追問(當時發現了什麼問題、怎麼定位的、為什麼選這個方案、結果如何量化):

這提示一個關鍵點:準備專案和 BQ 故事時不能只背 STAR 框架的空殼,技術原理、方案對比和最終的量化結果都要一起理順,否則追問兩輪就露餡。


Onsite 第一輪:Coding + LP

兩位 Senior AS 面試官聯合面試。流程是自我介紹 → 專案細節深挖(為什麼這麼選)→ 結合你的研究方向和職位業務方向做聯想。這一輪追問深度不如電話面。

兩道 BQ:如何應對緊迫的 deadline,如何做到刨根問底(Dive Deep)。之後會拋一個業務開放題——不用寫程式碼,只講思路:做交易類業務時哪些 feature 最關鍵,怎麼用機器學習篩出容易導致 deal 失敗的那些特徵。

編碼題:活躍度最低的 K 個使用者

給一批日誌資料,每條是 (user_id, timestamp)。算出每個使用者在指定時間段內的活躍天數(去重後的日期數),找出活躍度最低的 5 個使用者。

表面看是雜湊表計數的簡單題,但面試官會追加約束——資料量極大時如何做記憶體最佳化。最佳解是雜湊表配合最小堆:遍歷一遍統計每個使用者的活躍天數集合大小,再用一個大小為 K 的最小堆維護「目前活躍度最低的 K 個」。而且現場禁用 heapq,要求手寫堆結構和上浮 / 下沉調整邏輯。

思路拆解:

  1. 用雜湊表 user -> set(day) 去重統計每個使用者的活躍天數;只保留計數,day 集合可邊掃邊丟以省記憶體。
  2. 維護一個最小堆,堆裡放 (活躍天數, user)。要找「最低的 K 個」,最直接的做法是全量建堆再彈出 K 個;若記憶體吃緊,可反向用「大小為 K 的最大堆」邊掃邊淘汰較大值,把空間壓到 O(K)。
class MinHeap:
    """手寫最小堆,按元素第 0 位(count)比較。禁用 heapq 時使用。"""

    def __init__(self):
        self.data = []

    def _swap(self, i, j):
        self.data[i], self.data[j] = self.data[j], self.data[i]

    def push(self, item):
        self.data.append(item)
        self._sift_up(len(self.data) - 1)

    def pop(self):
        top = self.data[0]
        last = self.data.pop()
        if self.data:
            self.data[0] = last
            self._sift_down(0)
        return top

    def _sift_up(self, i):
        while i > 0:
            parent = (i - 1) // 2
            if self.data[i][0] < self.data[parent][0]:
                self._swap(i, parent)
                i = parent
            else:
                break

    def _sift_down(self, i):
        n = len(self.data)
        while True:
            left, right, smallest = 2 * i + 1, 2 * i + 2, i
            if left < n and self.data[left][0] < self.data[smallest][0]:
                smallest = left
            if right < n and self.data[right][0] < self.data[smallest][0]:
                smallest = right
            if smallest == i:
                break
            self._swap(i, smallest)
            i = smallest

    def __len__(self):
        return len(self.data)


def least_active_users(logs, k=5):
    """logs: List[(user_id, timestamp)];timestamp 為秒級 epoch。
    返回活躍天數最低的 k 個 user_id。"""
    day_sets = {}
    for user, ts in logs:
        day = ts // 86400                 # 歸一到「天」
        day_sets.setdefault(user, set()).add(day)

    heap = MinHeap()
    for user, days in day_sets.items():
        heap.push((len(days), user))      # (活躍天數, user)

    result = []
    for _ in range(min(k, len(heap))):
        count, user = heap.pop()
        result.append(user)
        _ = count
    return result

時間複雜度:統計 O(N),建堆並彈出 K 個為 O(M + K log M),M 為使用者數、N 為日誌條數。空間複雜度:O(M)。若記憶體吃緊,可把最小堆換成「維護大小為 K 的最大堆」,邊掃邊淘汰,空間壓到 O(K)。


Onsite 第二輪:Case Study + 最佳化理論(Principal AS 技術面)

這輪先從專案深挖切入,再轉向最佳化理論的硬核考察:

這裡給一份現場可手寫的梯度下降參考實作,用最基礎的線性迴歸 MSE 作載體:

import numpy as np


def gradient_descent(X, y, lr=0.01, max_iter=1000, tol=1e-6):
    """最小化 MSE 的批次梯度下降。
    X: (n, d),y: (n,)。返回權重 w 與偏置 b。"""
    n, d = X.shape
    w = np.zeros(d)
    b = 0.0
    prev_loss = float("inf")

    for it in range(max_iter):
        pred = X @ w + b
        error = pred - y
        loss = np.mean(error ** 2)                 # MSE

        grad_w = (2.0 / n) * (X.T @ error)         # 對 w 的梯度
        grad_b = (2.0 / n) * np.sum(error)         # 對 b 的梯度

        w -= lr * grad_w
        b -= lr * grad_b

        if abs(prev_loss - loss) < tol:            # 收斂:損失不再顯著下降
            break
        prev_loss = loss

    return w, b

時間複雜度:每輪 O(n·d),共 T 輪為 O(T·n·d)。停止標準通常是「損失變化 < tol」或「達到最大迭代數」,學習率過大會震盪不收斂、過小則收斂太慢。

緊接著是一道作業研究最佳化建模題:為配送中心設計補貨計畫,在需求、供應量、倉儲容量約束下最小化運輸和庫存成本,Follow-up 追問商品動態加價時目標函數和最優策略如何變化。

Case Study 部分是設計一套生鮮配送系統,同時解決車輛路徑規劃和到達時間預測,要考慮即時交通、時間窗口、保存期限和車輛容量限制。追問會落到模型訓練和評估上——路徑最佳化關注總里程、成本、準時率;時間預測則用 MAE、RMSE 和延遲訂單比例衡量,Precision / Recall 在這個場景並不適用,需要現場辨析清楚。最後收尾在三維裝箱問題:給定貨物尺寸、重量和卡車空間,如何擺放提升裝載率,同時滿足承重、方向、堆疊約束。


Onsite 第三輪:純 Coding(穿插一道 Ownership 行為題)

面試官簡單問了一道關於 Ownership 的行為題後直接進入編碼。題目是 OOD 設計——一個物品租賃系統,需要實作 ItemUserRental 等實體類別,透過 Manager 類別提供借出、歸還、查詢介面。

題目本身難度不高,考察重點在於類別的職責劃分是否清晰、物件關係是否合理、程式碼是否留有擴充空間。Follow-up 層層加碼:增加租賃到期時間和逾期罰金邏輯、支援按名稱模糊搜尋、提供返回完整目錄的介面、以及如何設計單元測試。整體考的是物件導向建模能力和介面設計,不是演算法技巧。

from dataclasses import dataclass
from typing import Dict, List, Optional


@dataclass
class Item:
    item_id: int
    name: str
    available: bool = True


@dataclass
class User:
    user_id: int
    name: str


@dataclass
class Rental:
    item_id: int
    user_id: int
    due_day: int
    returned_day: Optional[int] = None


class RentalManager:
    """租賃系統入口:借出、歸還、搜尋、目錄、逾期罰金。"""

    LATE_FEE_PER_DAY = 5

    def __init__(self):
        self.items: Dict[int, Item] = {}
        self.users: Dict[int, User] = {}
        self.rentals: List[Rental] = []

    def add_item(self, item: Item) -> None:
        self.items[item.item_id] = item

    def add_user(self, user: User) -> None:
        self.users[user.user_id] = user

    def borrow(self, user_id: int, item_id: int, due_day: int) -> bool:
        item = self.items.get(item_id)
        if item is None or not item.available or user_id not in self.users:
            return False
        item.available = False
        self.rentals.append(Rental(item_id, user_id, due_day))
        return True

    def give_back(self, user_id: int, item_id: int, today: int) -> int:
        """歸還並返回應繳逾期罰金(未逾期為 0)。"""
        for r in self.rentals:
            if r.item_id == item_id and r.user_id == user_id and r.returned_day is None:
                r.returned_day = today
                self.items[item_id].available = True
                overdue = max(0, today - r.due_day)
                return overdue * self.LATE_FEE_PER_DAY
        raise ValueError("沒有匹配的未歸還租賃記錄")

    def search(self, keyword: str) -> List[Item]:
        kw = keyword.lower()
        return [it for it in self.items.values() if kw in it.name.lower()]

    def catalog(self) -> List[Item]:
        return sorted(self.items.values(), key=lambda it: it.item_id)

設計要點Manager 持有實體的字典索引以支援 O(1) 查找;借出 / 歸還只翻轉 available 標誌並追加記錄,便於後續擴充預約佇列、多副本庫存等。逾期罰金用 due_day 與歸還日的差值計算,介面保持單一職責,方便寫單元測試。


Onsite 第四輪:ML Application + LP(Hiring Manager 主持)

偏機器學習系統設計,題目圍繞廣告推薦、CTR 預估等真實業務場景。回答建議按固定順序展開:需求釐清 → 資料與特徵 → 模型選型 → 訓練與離線評估 → 線上部署 → 監控與 A/B 測試。

注意:L4 候選人不一定會被安排這一輪。這輪考察的是 ML 知識的廣度,涵蓋範圍可以從線性迴歸一路延伸到 Transformer,常見考點包括 L1 / L2 正則化、過擬合、梯度消失、損失函數設計和 Transformer 原理。複習時別只背定義,要能講清楚每個方法的適用場景和優缺點,面試官很愛追問「什麼時候不該用這個」。


Onsite 第五輪:Bar Raiser(LP 總攻)

這輪由不屬於招聘團隊的 Bar Raiser 主持,專注考察 Leadership Principles,對最終是否發 Offer 的影響力很大。但要清楚一點:前面每一輪基本都會留出約 15 分鐘問一到兩個行為題,所以 LP 準備絕不能只留到最後一輪才做。

L4 / L5 / L6 行為面權重差異

級別 LP 深度 側重的 LP 維度
L4 講清楚一次完整經歷即可,追問一層 Learn and Be Curious、Ownership
L5 需要體現跨團隊協作與技術決策,追問兩到三層 Dive Deep、Deliver Results、Earn Trust
L6 要求戰略視野、影響力和帶人帶專案 Think Big、Have Backbone、Hire and Develop

級別越高,面試官越想看到你在更大範圍內的影響力面對分歧時的判斷力,故事的量級和複雜度要相應升級。


備考建議


FAQ

Q1:Amazon AS 面試和 SDE 面試最大的區別是什麼?

AS 在演算法之外額外考 ML 基礎、最佳化理論和 ML 系統設計,且行為題會往技術細節深挖。SDE 更偏純演算法與系統設計,ML 理論佔比很低。AS 候選人必須同時準備 Coding、ML 理論和 LP 三條線。

Q2:電話面的演算法題難度如何?

通常是一道 LeetCode 中等偏難的題,外加 ML 基礎問答和 LP。演算法本身不會特別刁鑽,但會追加記憶體最佳化、手寫資料結構等約束,考的是你能否在壓力下把最佳解講清楚並實作。

Q3:Applied Scientist 每一輪都會問行為題嗎?

基本是的。除了 Bar Raiser 專攻 LP,前面每一輪都會留 10–15 分鐘問一到兩個行為題。所以 LP 準備要貫穿整個 Loop,不能只壓到最後一輪。

Q4:L4、L5、L6 在面試上有什麼不同?

級別越高,行為面越看重跨團隊影響力、戰略視野和帶人帶專案的經歷,追問層數更多;技術面則期待更成熟的系統設計和更深的理論掌握。L4 可能不安排 ML 系統設計專場,L5/L6 通常會有。

Q5:現場禁用 heapq 之類的函式庫怎麼辦?

提前把最小堆 / 最大堆的上浮、下沉邏輯手寫練熟,梯度下降、KNN 也要能從零實作。面試官禁用函式庫就是想看你對底層資料結構和演算法的真實掌握,背 API 沒用。


正在準備 Amazon Applied Scientist 或其他 ML / AS 職位的 VO? 我們熟悉 AS 這類「演算法 + ML 理論 + 最佳化 + LP」多線並考的 Loop 打法,能陪你把專案故事技術化、手寫演算法和 LP 涵蓋一次打磨到位,提供全程 VO輔助 與 VO代面 支援。

立即加入微信 Coding0201取得一對一客製備考方案

聯絡方式