Meta DE 面經 | Python + Code 時間非常緊 Meta DS Senior面經

Meta DS 面經 | Python + Code 時間非常緊 Meta DS Senior面經

Meta de 主要考察簡單和聚合查詢、邏輯、排序、CTE、分組、時間點、CTE、過濾器、時間窗口等考察。這次面的senior level的,5個sql+5個python題,時間非常緊,一般做3+3比較保險,4+4肯定能進loop面試,分享下前兩天的 Meta DE 面經 。

Meta DE 面經:SQL

Meta DS 面经:SQL Q1

Q1

  • num_copies_not_returned:處於 “good” 狀態,且當前借閱還沒歸還的書本副本數
  • pct_renewed:在上面這批副本里,當前這次借閱 renewal_count > 2 的比例,範圍 0~100
SELECT
    COUNT(*) AS num_copies_not_returned,
    CASE
        WHEN COUNT(*) = 0 THEN 0
        ELSE 100.0 * SUM(CASE WHEN ch.renewal_count > 2 THEN 1 ELSE 0 END) / COUNT(*)
    END AS pct_renewed
FROM copies c
JOIN checkouts ch
    ON c.copy_id = ch.copy_id
WHERE c.condition = 'good'
  AND ch.returned_date IS NULL;

Q2

lifetime_value的定義:一本書被借出的總天數。需要滿足約束條件:未歸還的借閱記錄(returned_date IS NULL)不計入和只考慮擁有超過10個副本的書,找出 lifetime_value 最高的 前3本書。

SELECT 
    b.book_id,
    SUM(ch.returned_date - ch.checkout_date) AS lifetime_value
FROM books b
JOIN copies c ON b.book_id = c.book_id
JOIN checkouts ch ON c.copy_id = ch.copy_id
WHERE ch.returned_date IS NOT NULL
GROUP BY b.book_id
HAVING 
    (SELECT COUNT(*) FROM copies c2 WHERE c2.book_id = b.book_id) > 10
ORDER BY lifetime_value DESC
LIMIT 3;

Q3

圖書館會員可以預約書籍副本(排隊等候借閱),找出預約數量與其邀請人差異最大的那個會員。

SELECT
    m.member_id,
    m.invited_by_member_id,
    ABS(
        COUNT(c.copy_id) -
        COUNT(ic.copy_id)
    ) AS diff_num_reserved_copies
FROM members m
LEFT JOIN copies c
    ON c.reserved_by_member_id = m.member_id
LEFT JOIN members im
    ON im.member_id = m.invited_by_member_id
LEFT JOIN copies ic
    ON ic.reserved_by_member_id = im.member_id
GROUP BY
    m.member_id,
    m.invited_by_member_id
ORDER BY diff_num_reserved_copies DESC, m.member_id
LIMIT 1;

Q4

找在2024年連續兩個完整週都借過書的會員,然後從這些人中找出第一週借書數量最多的那個。

WITH member_week_checkouts AS (
    SELECT
        member_id,
        EXTRACT(WEEK FROM checkout_date)::INT AS week_idx,
        COUNT(*) AS num_copies
    FROM checkouts
    WHERE EXTRACT(YEAR FROM checkout_date) = 2024
      AND EXTRACT(WEEK FROM checkout_date) BETWEEN 1 AND 52
    GROUP BY
        member_id,
        EXTRACT(WEEK FROM checkout_date)
),
consecutive_weeks AS (
    SELECT
        w1.member_id,
        w1.week_idx AS first_week_index,
        w1.num_copies AS first_week_num_copies
    FROM member_week_checkouts w1
    JOIN member_week_checkouts w2
        ON w1.member_id = w2.member_id
       AND w2.week_idx = w1.week_idx + 1
)
SELECT
    member_id,
    first_week_index,
    first_week_num_copies
FROM consecutive_weeks
ORDER BY first_week_num_copies DESC, member_id, first_week_index
LIMIT 1;

Meta DE 面经:Code

Q1

最多選 3 本書,每本書必須來自不同 category,每本書有 (category, points),求最大總分

def get_max_score(books):
    # 每個category保留最高分
    best = {}

    for category, score in books:
        if category not in best or score > best[category]:
            best[category] = score

    # 取所有category的最高分
    scores = sorted(best.values(), reverse=True)
    # 最多取3個
    return sum(scores[:3])

Q2

圖書館每次借書或還書都會產生一條日誌,日誌包含書的ID和操作型別(借出/歸還)。驗證日誌序列是否合法,遇到以下兩種非法情況返回 False

Meta DS 面经:Code Q2
from dataclasses import dataclass

@dataclass
class LogEntry:
    book_id: int
    is_checkout: bool  # True = checkout, False = return

def are_log_entries_valid(log_entries):
    checked_out = set()

    for entry in log_entries:
        book_id = entry.book_id

        if entry.is_checkout:
            # checkout
            if book_id in checked_out:
                return False
            checked_out.add(book_id)

        else:
            # return
            if book_id not in checked_out:
                return False
            checked_out.remove(book_id)

    return True

Q3

圖書館有4個分館(A/B/C/D),某些分館關閉時,員工會去備用分館或在家工作。給定一組關閉的分館,返回每個開放分館的實際員工總數。

以A為例:”A”: {“A”: 80, “B”: 10, “C”: 15, “D”: 5}

  • A館共有80人
  • 如果A關閉:10人去B,15人去C,5人去D,剩餘50人在家(80-10-15-5=50,不計入任何館)
Meta DS 面经:Code Q3
def get_num_employees(location_employees: dict[str, dict[str, int]],
                      closed_locations: set[str]) -> dict[str, int]:
    result = {}

    # 先給所有未關閉辦公室初始化為 0
    for loc in location_employees:
        if loc not in closed_locations:
            result[loc] = 0

    # 遍歷每個“員工原屬辦公室”
    for src, dist in location_employees.items():
        if src in closed_locations:
            # src 關閉:員工分流到其他未關閉辦公室
            for dst, cnt in dist.items():
                if dst != src and dst not in closed_locations:
                    result[dst] += cnt
        else:
            # src 未關閉:本辦公室員工仍在原辦公室上班
            result[src] += dist[src]

    return result

Q4

original_name 中刪掉若干字母,能否得到 new_name?如果能,返回刪掉了多少個字母;不能則返回 -1。忽略空格和大小寫,new_name必須是original_name的子序列。

Meta DS 面经:Code Q3
def get_num_letters(original_name: str, new_name: str) -> int:
    # 忽略大小写 + 去掉空格
    original = original_name.replace(" ", "").lower()
    new = new_name.replace(" ", "").lower()

    i = 0
    j = 0

    # 双指针检查 subsequence
    while i < len(original) and j < len(new):
        if original[i] == new[j]:
            j += 1
        i += 1

    # 如果 new 没完全匹配
    if j != len(new):
        return -1

    # 删除字符数
    return len(original) - len(new)

總體都還可以,就是一小時內,時間非常的緊張,剛開始沒多問直接開始SQL環節,總共做了4+4個問題,給的提示很到位了,也做完了,面試官還是非常肯定學生的能力的,Meta最近的SDE面的多,DS的也沒問題,搞不定的。

整場面試下來可以發現,Meta 的題更多的考基礎,時間非常有限,一般很難完成4個sql+4個code。如果你也擔心在 Meta 或其他大廠面試中遇到類似情況,不如瞭解一下我們的 VO遠端助攻服務 ,目前已經幫助數百名學員順利拿下 offer,讓面試不再慌亂,思路清晰,成功率大大提升。

author avatar
Jack Xu MLE | 微軟人工智慧技術人員
Princeton University博士,人在海外,曾在谷歌、蘋果等多家大廠工作。深度學習NLP方向擁有多篇SCI,機器學習方向擁有Github千星⭐️專案。
END
 0