Python Trie实现LeetCode内存文件系统ls返回错误排查
内存文件系统实现问题修复
你的判断是对的,问题根源就是节点设计没有区分文件和目录,加上文件存储逻辑错误,导致ls访问文件路径时把内容当成了子项返回。
现有代码的核心错误
- 节点结构无类型标识:所有节点都用普通字典实现,无法区分当前路径终点是文件还是目录
- 文件存储逻辑错误:把文件内容作为字典键、
'*'作为值存在路径终点,导致访问文件路径拿到的节点的key就是内容本身,ls遍历key时自然返回了内容而非文件名 - 路径
split('/')产生的空字符串虽然没触发根路径报错,但属于隐含的逻辑不严谨问题
修复方案
统一节点结构,给每个节点加两个内部保留字段做标记:
__is_file__:布尔值,标记当前节点是不是文件__content__:字符串,仅文件节点使用,存储文件内容
其余字典键均为目录下的子文件/子目录名。
对应调整三个核心逻辑:
- ls方法遍历到路径终点后,先判断节点类型:如果是文件直接返回仅含当前文件名的列表;如果是目录则过滤掉内部保留字段,对子项排序后返回
- mkdir方法创建的节点默认标记为目录
- addContentToFile方法在路径最后一段创建/更新文件节点,内容直接存在节点的
__content__字段,追加时直接拼接字符串,不要把内容当字典键存
修正后可直接通过的代码
from typing import List class FileSystem: def __init__(self): self.root = {"__is_file__": False, "__content__": ""} def ls(self, path: str) -> List[str]: path_parts = [p for p in path.split("/") if p] cur = self.root for part in path_parts: cur = cur[part] if cur["__is_file__"]: return [path_parts[-1]] children = [name for name in cur.keys() if not name.startswith("__")] return sorted(children) def mkdir(self, path: str) -> None: path_parts = [p for p in path.split("/") if p] cur = self.root for part in path_parts: if part not in cur: cur[part] = {"__is_file__": False, "__content__": ""} cur = cur[part] def addContentToFile(self, filePath: str, content: str) -> None: path_parts = [p for p in filePath.split("/") if p] cur = self.root for part in path_parts[:-1]: if part not in cur: cur[part] = {"__is_file__": False, "__content__": ""} cur = cur[part] file_name = path_parts[-1] if file_name not in cur: cur[file_name] = {"__is_file__": True, "__content__": content} else: cur[file_name]["__content__"] += content def readContentFromFile(self, filePath: str) -> str: path_parts = [p for p in filePath.split("/") if p] cur = self.root for part in path_parts: cur = cur[part] return cur["__content__"]
验证说明
用你给出的错误测试用例运行,执行ls("/goowmfn/c")时,检测到c是文件节点,会直接返回["c"],和预期输出完全一致,不会再错误返回文件内容。
内容的提问来源于stack exchange,提问作者young_coder
相关产品推荐
相关产品推荐

