题目描述:
一个文件目录的数据格式为:目录
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
以逗号分隔。
输出描述:
待查询目录及其子目录的大小之和
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String def = sc.nextLine();
String[] defArr = def.split(" ");
int n = Integer.parseInt(defArr[0]);
String initId = defArr[1];
Map<String,Integer> sizeMap = new HashMap<>();
Map<String, List<String>> strMap = new HashMap<>();
for(int i=0;i<n;i++){
String str = sc.nextLine();
String[] strArr = str.split(" ");
String size = strArr[1];
if("".equals(size)){
sizeMap.put(strArr[0],0);
}else{
sizeMap.put(strArr[0],Integer.parseInt(size));
}
List<String> stringList = new ArrayList<>();
if(null!=strArr[2] && !"0".equals(strArr[2])){
stringList = Arrays.asList(strArr[2].split(","));
}
strMap.put(strArr[0],stringList);
}
int allSize = getSum(initId,sizeMap,strMap,0);
System.out.println(allSize);
}
/**
* 递归获取所有目录大小
* @param id
* @param sizeMap
* @param strMap
* @param allSize
* @return
*/
public static int getSum(String id,Map<String,Integer> sizeMap,Map<String, List<String>> strMap,int allSize){
List<String> ids = strMap.get(id);
allSize = allSize + sizeMap.get(id);
if(ids.size()>0){
for (String s:ids) {
allSize = getSum(s,sizeMap,strMap,allSize);
}
}
return allSize;
}