题目描述
一个文件目录的数据格式为:目录id,本目录中文件大小,(子目录id列表)。
其中目录id全局唯一,取值范围[1,200],本目录中文件大小范围[1,1000],子目录id列表个数[0,10]例如:1 20 (2,3)表示目录1中文件总大小是20,有两个子目录,id分别是2和3
现在输入一个文件系统中所有目录信息,以及待查询的目录id,返回这个目录和及该目录所有子目录的大小之和。
输入描述
第一行为两个数字M,N,分别表示目录的个数和待查询的目录id,
·1≤M≤100
·1≤N≤200
接下来M行,每行为1个目录的数据:
目录id本目录中文件大小(子目录id列表)
子目录列表中的子目录id以逗号分隔。
输出描述
待查询目录及其子目录的大小之和
import java.util.*
public class Main {
public static void main() {
Scanner sc = new Scanner(System.in);
String mn = sc.nextLine();
String[] mns = mn.split();
int m = Integer.valueOf(mns[0]);
int n = Integer.valueOf(mns[1]); //解析第一行数据M、N
Map<Integer, Integer> idValueMap = new HashMap<>();
Map<Integer, int[]> idChildrenMap = new HashMap<>();
while(sc.hasNexLine()) {
String input = sc.nexLine();
String[] inputs = input.split();
int id = Integer.valueOf(inputs[0]);
int size = Integer.valueOf(inputs[1]);
idValueMap.put(id, size);
String[] tmp = inputs[2].substring(0, inputs[2].length()-2).split(",");
int[] childrens = new int[tmp.length];
for(int i = 0; i < tmp.length; i++) {
childrens[i] = Integer.valueOf(tmp[i]);
}
idChildrenMap.put(id, childrens);
}
Stack<Integer> stack = new Stack<>();
stack.push(n);
int size;
while(!stack.isEmpty()) {
size += idValueMap.get(stack.pop());
int[] childrens = idChildreMap.get(stack.pop());
for(int i=0; i < childrens.length; i++) {
stack.push(childres[i]);
}
}
System.out.println(size);
}
}