OCI SWE · Phone Screen Coding

Oracle 文件管理题:基于已有 Folder→Files 映射补三个操作

按 HackerRank 电面的现有哈希表与接口,说明目录存在检查、建目录和建文件的训练语义与边界。

题目重点:按 HackerRank 电面的现有哈希表与接口,说明目录存在检查、建目录和建文件的训练语义与边界。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版仅支持单层文件夹名与文件名,不支持路径层级;名称非空且不得含斜杠。此约定避免虚构原题的路径规则。
  • 重复建文件夹/文件报错,给不存在文件夹建文件报错;题目未明确这些返回值,需在面试中先确认。

解题路线

  1. 保留给定的数据模型,用 map 以文件夹名索引文件列表;存在检查只看 key 是否出现。
  2. 建文件夹先校验名字与重名,再插入空列表。建文件先校验父文件夹存在,再检查同名文件并追加。
  3. 如果要高效判断同名文件,可把每个文件夹的 list 与 set 配套维护;但原题给定的 list 结构可能要求保持文件顺序,不能未经确认换成 set。
  4. 若需求升级到嵌套路径,单纯 folder name 不能唯一标识不同父目录下的同名文件夹;应换为规范化全路径或树节点映射。

手动走一遍

createFolder(docs) 后 check(docs)=true;createFile(docs,a.txt) 后映射为 docs→[a.txt]。再次创建 a.txt 按训练版报重复错误;createFile(missing,a.txt) 报父目录不存在。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

"""Single-level folder-to-file-list training model from the published interface."""


class FolderFileManager:
    def __init__(self):
        self.folders: dict[str, list[str]] = {}

    @staticmethod
    def _name(value: str) -> None:
        if not value or "/" in value:
            raise ValueError("name must be nonempty and contain no slash")

    def check_if_folder_exists(self, folder: str) -> bool:
        self._name(folder)
        return folder in self.folders

    def create_folder(self, folder: str) -> None:
        self._name(folder)
        if folder in self.folders:
            raise ValueError("folder already exists")
        self.folders[folder] = []

    def create_file(self, folder: str, filename: str) -> None:
        self._name(folder)
        self._name(filename)
        if folder not in self.folders:
            raise KeyError("folder not found")
        if filename in self.folders[folder]:
            raise ValueError("file already exists")
        self.folders[folder].append(filename)

复杂度

存在检查与建目录按哈希表平均 O(1);建文件需在线性文件列表查重 O(F),F 为该目录文件数,追加均摊 O(1);总存储 O(目录数+文件数)。

易错点与追问

容易失分的边界

  • 看到“file management”就做 Trie 或完整文件系统,忽略题面给定 map 结构和三个接口。
  • 以 folder name 充当嵌套路径唯一键,导致同名目录冲突。
  • 未询问重名和不存在父目录规则,导致边界测试失败。

继续深挖

  • 若要求移动目录和嵌套路径,如何升级索引并处理子树重命名?
  • 若一个目录百万文件,如何将重名检查降为平均 O(1) 且保留稳定列表顺序?
✓已复制微信号!