通过率 66% · 提交 304 · 通过 200
小慕正在管理一个文件系统,其中每个目录的数据格式为:,本目录中文件大小,()。目录id全局唯一,取值范围[1, 200],本目录中文件大小范围[1, 1000],子目录id列表个数[0,10]。例如:1 20 (2,3) 表示目录1中文件总大小是20,有两个子目录,id分别是2和3。现在小慕拿到了这个文件系统中所有目录的信息,以及一个,需要计算并返回该目录及其所有子目录的文件大小之和。
这类题属于华为 OD 机考真题方向中「100分 / DFS」方向的高频题型,通常考察对「100分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为两个数字M,N,分别表示目录的个数和待查询的目录id, 1 ≤ M ≤ 100 1 ≤ N ≤ 200 接下来M行,每行为1个目录的数据: 目录id 本目录中文件大小 (子目录id列表) 子目录列表中的子目录id以逗号分隔。
待查询目录以及其子目录之和
示例 1
输入示例
3 1 3 15 () 1 20 (2) 2 10 (3)
输出示例
45
目录1大小为20,包含一个子目录2(大小为10),子目录2包含1个子目录3(大小为15),总的大小为20+10+15=45
示例 2
输入示例
4 2 4 20 () 5 30 () 2 10 (4,5) 1 40 ()
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意,本题的思路以及解法和 【BFS】2025A-BOSS的收入 非常类似。
当我们查询编号为 target_idx 的文件目录时,我们必须统计其下面所有子文件夹的目录总和。换句话说,某一个节点的总大小,是由其下面所有的节点的和来决定的。
我们需要一个长度为 M 的哈希表 size_table,用来存放每一个目录的大小。
我们构建邻接表,键为父节点的 id,值为其子节点 id 所构成的列表。
由于 DFS 需要用递归来解决,我们考虑 递归三要素:
cur_idx 不存在任何一个子目录,无需再进行向下递归。target_idx 作为实参传入 dfs() 函数的参数 cur_idx 中,表示从查询节点 target_idx 开始进行搜索。因此可以构造这样的 DFS 函数以及调用:
显然这个树形结构也存在依赖关系:如果要计算某个父节点的大小,必须将其所有的子节点都计算完毕后才行。在这个角度上,父节点大小的计算实际上是依赖于其所有子节点的。
如果画成有向图的话,在计算大小的问题上,边的方向是从子节点指向父节点。因此在数据储存上,我们需要反过来构建邻接表,以子节点为键,子节点对应的父节点为值。当然,在 DFS 解法中存放每一个目录的大小的哈希表 size_table 也是需要的。在处理原始数据的过程中,我们也可以同时构建入度表 indegree_list。
因此我们可以将所有叶节点(不包含子节点的节点)作为拓扑排序的初始节点。然后就可以进行常规的拓扑排序了:
解法一:DFS
复杂度分析 设 n 为目录总数(题面约定目录 id 取值范围 [1, 200],每个目录的子目录个数不超过 10)。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
60
目录2包含2个子目录4和5,总的大小为10 + 20 + 30 = 60
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有