华为OD【文件目录大小】


思路:遍历目录树结构
DFS递归
import java.sql.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
/*
3 1
3 15 (0)
1 20 (2)
2 10 (3)
4 2
4 20 ()
5 30 ()
2 10 (4,5)
1 40 ()
4 1
1 20 (2,3)
2 20 ()
3 20 (4,5)
5 20 ()
*/
Scanner scanner = new Scanner(System.in);
HashMap<Integer,Dir> dirs = new HashMap<>();
String[] params = scanner.nextLine().split(" ");
int M = Integer.parseInt(params[0]);
int N = Integer.parseInt(params[1]);
for(int i = 0; i < M; i++){
String[] info = scanner.nextLine().split(" ");
int id = Integer.parseInt(info[0]);
int size = Integer.parseInt(info[1]);
String temp_subDir = info[2];
//如果当前目录的子目录为空
if(temp_subDir.length() == 2){
dirs.put(id,new Dir(id,size,null));
}else{//不为空
//去掉前后括号
String subDir = temp_subDir.substring(1,temp_subDir.length() - 1);
// System.out.println(subDir); //1,2,3,4,5,6
String[] split = subDir.split(",");
ArrayList<Integer> sub_ids = new ArrayList<>();
for (String s : split) {
sub_ids.add(Integer.parseInt(s));
}
dirs.put(id,new Dir(id,size,sub_ids));
}
}
// for(Map.Entry e : dirs.entrySet()){
// System.out.println(e.getKey() + " " + e.getValue().toString());
// }
Dir dir = dirs.get(N);
int capacity = caculate(dir,dirs);
System.out.print(capacity);
}
private static int caculate(Dir dir,HashMap<Integer,Dir> map){
if(dir == null) {
return 0;
}
int sum = 0;
sum += dir.size;
if(dir.subDir == null){
return sum;
}
for(int i = 0; i < dir.subDir.size(); i++){
sum += caculate(map.get(dir.subDir.get(i)),map);
}
return sum;
}
private static class Dir{
Integer id;
Integer size;
ArrayList<Integer> subDir;
public Dir(Integer id,Integer size, ArrayList<Integer> subDir){
this.id = id;
this.size = size;
this.subDir = subDir;
}
@Override
public String toString() {
return this.id + " " + this.size + " " + this.subDir.toString();
}
}
}
BFS非递归
import java.sql.Array;
import java.util.*;
public class Demo {
public static void main(String[] args) {
/*
3 1
3 15 (0)
1 20 (2)
2 10 (3)
4 2
4 20 ()
5 30 ()
2 10 (4,5)
1 40 ()
4 1
1 20 (2,3)
2 20 ()
3 20 (4,5)
5 20 ()
*/
Scanner scanner = new Scanner(System.in);
HashMap<Integer,Dir> dirs = new HashMap<>();
String[] params = scanner.nextLine().split(" ");
int M = Integer.parseInt(params[0]);
int N = Integer.parseInt(params[1]);
for(int i = 0; i < M; i++){
String[] info = scanner.nextLine().split(" ");
int id = Integer.parseInt(info[0]);
int size = Integer.parseInt(info[1]);
String temp_subDir = info[2];
//如果当前目录的子目录为空
if(temp_subDir.length() == 2){
dirs.put(id,new Dir(id,size,null));
}else{//不为空
//去掉前后括号
String subDir = temp_subDir.substring(1,temp_subDir.length() - 1);
// System.out.println(subDir); //1,2,3,4,5,6
String[] split = subDir.split(",");
ArrayList<Integer> sub_ids = new ArrayList<>();
for (String s : split) {
sub_ids.add(Integer.parseInt(s));
}
dirs.put(id,new Dir(id,size,sub_ids));
}
}
// for(Map.Entry e : dirs.entrySet()){
// System.out.println(e.getKey() + " " + e.getValue().toString());
// }
LinkedList<Dir> queue = new LinkedList<>();
Dir dir = dirs.get(N);
if(dir != null){
queue.add(dir);
}
int sum = 0;
while(queue.size() > 0){
Dir cur_dir = queue.getFirst();
queue.removeFirst();
sum += cur_dir.size;
if(cur_dir.subDir != null){
for(int i = 0; i < cur_dir.subDir.size(); i++){
Dir dir1 = dirs.get(cur_dir.subDir.get(i));
if(dir1 != null){
queue.add(dir1);
}
}
}
}
System.out.print(sum);
}
private static class Dir{
Integer id;
Integer size;
ArrayList<Integer> subDir;
public Dir(Integer id,Integer size, ArrayList<Integer> subDir){
this.id = id;
this.size = size;
this.subDir = subDir;
}
@Override
public String toString() {
return this.id + " " + this.size + " " + this.subDir.toString();
}
}
}
浙公网安备 33010602011771号