华为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();
        }
    }
}
posted @ 2025-04-25 15:08  破忒头头  阅读(39)  评论(0)    收藏  举报