Meta de 主要考察簡單和聚合查詢、邏輯、排序、CTE、分組、時間點、CTE、過濾器、時間窗口等考察。這次面的senior level的,5個sql+5個python題,時間非常緊,一般做3+3比較保險,4+4肯定能進loop面試,分享下前兩天的 Meta DE 面經 。
Meta DE 面經:SQL
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。
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,不計入任何館)
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的子序列。
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,讓面試不再慌亂,思路清晰,成功率大大提升。