← 返回博客列表
Meta

Meta OA 真題複盤:雲存儲系統 90分鐘四道題完整解析

2026-03-15

Meta OA Level 1

題目概述

這是Meta的經典OA題目,考察對文件系統設計數據結構的理解。整個題目分為4個難度等級,從基礎的文件操作逐步升級到複雜的用戶容量管理和文件壓縮。

時間分配建議


Level 1:基礎文件操作

Meta OA Level 1 Details

題目要求

實現一個內存雲存儲系統,支持三個基礎操作:

  1. add_file(self, name: str, size: int) -> bool - 添加新文件到存儲系統。返回 True 如果添加成功,False 如果文件已存在。

  2. copy_file(self, name_from: str, name_to: str) -> bool - 複製文件從 name_fromname_to。如果源文件不存在或目標文件已存在,返回 False

  3. get_file_size(self, name: str) -> int | None - 返回文件大小,如果文件不存在返回 None

解題思路

這是最基礎的題目,直接使用**哈希表(字典)**存儲文件即可。

class CloudStorage:
    def __init__(self):
        self.files = {}
    
    def add_file(self, name: str, size: int) -> bool:
        if name in self.files:
            return False
        self.files[name] = size
        return True
    
    def copy_file(self, name_from: str, name_to: str) -> bool:
        if name_from not in self.files or name_to in self.files:
            return False
        self.files[name_to] = self.files[name_from]
        return True
    
    def get_file_size(self, name: str) -> int | None:
        return self.files.get(name)

時間複雜度分析

操作 時間複雜度 空間複雜度
add_file O(1) O(1)
copy_file O(1) O(1)
get_file_size O(1) -

Level 2:前綴後綴搜索

![Meta OA Level 2](/images/meta/image copy 3.png)

題目要求

在Level 1的基礎上,添加文件搜索功能:

find_file(self, prefix: str, suffix: str) -> list[str]

解題思路

關鍵是高效的字符串匹配正確的排序

def find_file(self, prefix: str, suffix: str) -> list[str]:
    result = [
        (name, self.files[name])
        for name in self.files
        if name.startswith(prefix) and name.endswith(suffix)
    ]
    result.sort(key=lambda x: (-x[1], x[0]))
    return [f"{name}({size})" for name, size in result]

時間複雜度分析

操作 時間複雜度 說明
搜索 O(n·m) n=文件數,m=平均名字長度
排序 O(k·log k) k=匹配的文件數
總體 O(n·m + k·log k) -

Level 3:用戶容量管理

![Meta OA Level 3](/images/meta/image copy 2.png)

題目要求

支持多用戶和容量限制:

  1. add_user(self, user_id: str, capacity: int) -> bool - 添加新用戶,分配存儲容量。用戶已存在返回 False

  2. add_file_by(self, user_id: str, name: str, size: int) -> int | None - 用戶添加文件,返回剩餘容量。如果超過容量限制,返回 None

  3. update_capacity(self, user_id: str, capacity: int) -> int | None - 更新用戶容量。如果新容量不足以容納現有文件,刪除最大的文件(字典序作為tiebreaker)。返回刪除的文件數。

解題思路

需要維護用戶-文件映射容量追踪

def add_user(self, user_id: str, capacity: int) -> bool:
    if user_id in self.users:
        return False
    self.users[user_id] = capacity
    self.user_files[user_id] = {}
    return True

def add_file_by(self, user_id: str, name: str, size: int) -> int | None:
    if user_id not in self.users:
        return None
    used = sum(self.user_files[user_id].values())
    remaining = self.users[user_id] - used
    if size > remaining:
        return None
    self.user_files[user_id][name] = size
    self.files[name] = size
    return remaining - size

def update_capacity(self, user_id: str, capacity: int) -> int | None:
    if user_id not in self.users:
        return None
    self.users[user_id] = capacity
    used = sum(self.user_files[user_id].values())
    if used <= capacity:
        return 0
    
    files_list = sorted(
        self.user_files[user_id].items(),
        key=lambda x: (-x[1], x[0])
    )
    removed = 0
    for name, size in files_list:
        if used <= capacity:
            break
        del self.user_files[user_id][name]
        del self.files[name]
        used -= size
        removed += 1
    return removed

時間複雜度分析

操作 時間複雜度
add_user O(1)
add_file_by O(1)
update_capacity O(k·log k)

Level 4:文件壓縮與解壓

![Meta OA Level 4](/images/meta/image copy.png)

題目要求

添加文件壓縮功能:

  1. compress_file(self, name: str) -> bool - 壓縮文件,大小變為原來的一半(向下取整)。文件不存在返回 False

  2. decompress_file(self, name: str) -> bool - 解壓文件,恢復原始大小。文件不存在或未壓縮返回 False

解題思路

需要追踪文件的壓縮狀態原始大小

def compress_file(self, name: str) -> bool:
    if name not in self.files or self.is_compressed[name]:
        return False
    self.files[name] //= 2
    self.is_compressed[name] = True
    return True

def decompress_file(self, name: str) -> bool:
    if name not in self.files or not self.is_compressed[name]:
        return False
    self.files[name] = self.original_size[name]
    self.is_compressed[name] = False
    return True

完整代碼實現

class CloudStorage:
    def __init__(self):
        self.files = {}
        self.original_size = {}
        self.is_compressed = {}
        self.users = {}
        self.user_files = {}
    
    def add_file(self, name: str, size: int) -> bool:
        if name in self.files:
            return False
        self.files[name] = size
        self.original_size[name] = size
        self.is_compressed[name] = False
        return True
    
    def copy_file(self, name_from: str, name_to: str) -> bool:
        if name_from not in self.files or name_to in self.files:
            return False
        self.files[name_to] = self.files[name_from]
        self.original_size[name_to] = self.original_size[name_from]
        self.is_compressed[name_to] = self.is_compressed[name_from]
        return True
    
    def get_file_size(self, name: str) -> int | None:
        return self.files.get(name)
    
    def find_file(self, prefix: str, suffix: str) -> list[str]:
        result = [
            (name, self.files[name])
            for name in self.files
            if name.startswith(prefix) and name.endswith(suffix)
        ]
        result.sort(key=lambda x: (-x[1], x[0]))
        return [f"{name}({size})" for name, size in result]
    
    def add_user(self, user_id: str, capacity: int) -> bool:
        if user_id in self.users:
            return False
        self.users[user_id] = capacity
        self.user_files[user_id] = {}
        return True
    
    def add_file_by(self, user_id: str, name: str, size: int) -> int | None:
        if user_id not in self.users:
            return None
        used = sum(self.user_files[user_id].values())
        remaining = self.users[user_id] - used
        if size > remaining:
            return None
        self.user_files[user_id][name] = size
        self.files[name] = size
        self.original_size[name] = size
        self.is_compressed[name] = False
        return remaining - size
    
    def update_capacity(self, user_id: str, capacity: int) -> int | None:
        if user_id not in self.users:
            return None
        self.users[user_id] = capacity
        used = sum(self.user_files[user_id].values())
        if used <= capacity:
            return 0
        
        files_list = sorted(
            self.user_files[user_id].items(),
            key=lambda x: (-self.files[x[0]], x[0])
        )
        removed = 0
        for name, _ in files_list:
            if used <= capacity:
                break
            used -= self.files[name]
            del self.user_files[user_id][name]
            del self.files[name]
            removed += 1
        return removed
    
    def compress_file(self, name: str) -> bool:
        if name not in self.files or self.is_compressed[name]:
            return False
        self.files[name] //= 2
        self.is_compressed[name] = True
        return True
    
    def decompress_file(self, name: str) -> bool:
        if name not in self.files or not self.is_compressed[name]:
            return False
        self.files[name] = self.original_size[name]
        self.is_compressed[name] = False
        return True

臨場應對策略

時間管理

階段 時間 任務
0-5分鐘 5分 理解題意,明確需求
5-25分鐘 20分 完成Level 1-2
25-55分鐘 30分 完成Level 3
55-85分鐘 30分 完成Level 4 + 測試
85-90分鐘 5分 檢查代碼,提交

常見錯誤

容量計算錯誤:忘記考慮壓縮狀態
排序順序混亂:大小降序 + 名字升序
文件所有權混淆:複製文件時保留原所有者
邊界條件遺漏:用戶不存在、文件不存在等

最佳實踐


總結

這道題從基礎數據結構逐步升級到系統設計,考察的核心能力包括:

  1. 數據結構選擇:哈希表、排序
  2. 狀態管理:追踪文件、用戶、容量
  3. 算法設計:搜索、排序、容量管理
  4. 代碼質量:清晰的邏輯、完善的邊界處理

關鍵要點


🚀 需要面試輔助?

oavoservice 提供專業的 OA/VO 輔助服務,幫助你快速通過Meta、Amazon等大廠的技術面試。

👉 立即添加微信:Coding0201

我們的服務包括: