华为OD机试真题 Java 实现【文件目录大小】【2023 B卷 100分】,附详细解题思路

news2024/12/26 21:54:33

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、再输入
      • 5、再输出
      • 6、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

一、题目描述

一个文件目录的数据格式为:

目录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,以逗号分隔

三、输出描述

待查询目录及其子目录的大小之和。

四、解题思路

题意描述的很复杂,其实很简单。

  1. 第一行输入目录的个数 + 待查询的目录id;
  2. 接下来的M行,输入目录id 本目录中文件大小(子目录id列表),比如1 20 (2),表示目录1的文件大小为20,包含子目录2;
  3. 最后要求输出目录+子目录的文件大小之和。

比如输入:

3 1
1 10 (2)
2 20 (3)
3 30 (4)

  1. 目录的个数为3,从1开始;
  2. 1的大小为10,子目录2;
  3. 2的大小为20,子目录3,;
  4. 3的大小为30,子目录4,没有;
  5. 输出10 + 20 +30 = 60;

如果输入改为:

3 2
1 10 (2)
2 20 (3)
3 30 (4)

  1. 目录的个数为3,从2开始;
  2. 2的大小为20,子目录3;
  3. 3的大小为30,子目录4,没有;
  4. 输出20 +30 = 50;

五、Java算法源码

package com.guor.od;

import java.util.Scanner;
import java.util.*;
import java.util.HashMap;
import java.util.stream.Collectors;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[] line1 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // 目录的个数
        int M = line1[0];
        // 待查询的目录id
        int N = line1[1];

        /**
         * 目录id包含的子目录id
         *
         * key:目录id
         * value:子目录id
         */
        Map<Integer, List<Integer>> idMap = new HashMap<>();

        /**
         * 目录大小信息
         *
         * key:目录id
         * value:目录大小
         */
        Map<Integer, Integer> dirMap = new HashMap<>();
        for (int i = 0; i < M; i++) {

            String[] lineM = sc.nextLine().split(" ");

            // 目录id
            int id = Integer.parseInt(lineM[0]);
            // 本目录中文件大小
            int size = Integer.parseInt(lineM[1]);
            if(dirMap.containsKey(id)){
                System.out.println("输入目录id不可重复,重复id:"+id);
                return;
            }
            idMap.put(id, new ArrayList<>());
            dirMap.put(id, size);

            // 子目录id
            String childs = lineM[2];
            // 子目录是()时,长度为2,子目录为空1
            if (childs.length() == 2) {
                continue;
            }

            // 子目录数组
            String[] childArr = childs.replace("(", "").replace(")", "").split(",");
            List<Integer> childList = Arrays.stream(childArr).map(Integer::parseInt).collect(Collectors.toList());
            idMap.get(id).addAll(childList);
        }

        // 递归获取有效的id集合
        getIdList(N,idMap);

        System.out.println("有效的id集合:"+idList);

        int sum = 0;
        // 获取有效的id的目录文件大小
        for(Integer id : idList){
            sum += dirMap.get(id);
        }

        // 输出目录大小之和
        System.out.println(sum);
    }

    /**
     * 递归获取有效的id集合
     *
     * @param start 待查询的目录id
     * @param map id集合
     * @return
     */
    // 有效的id集合
    static List<Integer> idList = new ArrayList<>();
    private static void getIdList(int target, Map<Integer, List<Integer>> map) {
        // 如果有子目录
        if(map.containsKey(target)){
            idList.add(target);
            // 获取子集合id
            List<Integer> list = map.get(target);
            // 取过了,删除该id
            map.remove(target);
            // 递归子目录id,将其加入有效的id集合
            for(Integer id : list){
                getIdList(id,map);
            }
        }else{// 如果没有子目录,直接将其加入idList
            idList.add(target);
        }
    }
}

六、效果展示

1、输入

3 1
1 10 (2)
2 20 (3)
3 30 ()

2、输出

60

3、说明

  1. 一共3个目录id;
  2. 开始目录id为1,其大小为10,子目录id为2;
  3. 2的大小为20,子目录id为3;
  4. 3的大小为30,没有子目录;
  5. 故输出10 + 20 + 30 = 60

在这里插入图片描述

4、再输入

5 1
1 10 (2,3,5)
2 20 ()
3 30 ()
4 40 (1)
5 50 (2)

5、再输出

130

6、说明

  1. 一共5个目录id;
  2. 开始目录id为1,其大小为10,子目录id为2,3,5;
  3. 2的大小为20,没有子目录;
  4. 3的大小为30,没有子目录;
  5. 5的大小为50,子目录为2;
  6. 2的大小为20,没有子目录;
  7. 故输出10 + 20 + 30 + 50 + 20 = 130

思路如此清晰,来,打开idea,试一下~~


🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python内置函数系统学习(1)——数据转换与计算(详细语法参考 + 参数说明 + 具体示例)

世界上最重要的东西就是纸&#xff0c;重至承载文明的崛起&#xff0c;轻至承载一个饱满厚实的人生。 &#x1f3af;作者主页&#xff1a; 追光者♂&#x1f525; &#x1f338;个人简介&#xff1a; &#x1f496;[1] 计算机专业硕士研究生&#x1f496; &#x1f31f;[2]…

最小生成树算法(Prim Kruskal)

目录 最小生成树算法总览最小生成树的定义及性质Prim&#xff08;普利姆&#xff09;算法1.朴素Prim算法算法步骤 2.堆优化Prim算法算法步骤 3.算法运用Prim算法求最小生成树流程实现朴素Prim的代码实现堆优化Prim的代码实现 Kruskal&#xff08;克鲁斯卡尔&#xff09;算法1.算…

IAR for STM8L标准库驱动ST7735 1.8‘‘LCD显示

IAR for STM8L标准库驱动ST7735 1.8’LCD显示 ✨STM8驱动ST7735 1.8’LCD屏幕的话&#xff0c;自己移植的话&#xff0c;可以参考stm32标准库驱动来移植&#xff0c;GPIO的操作方式和STM32标准库函数名都一致&#xff0c;移植起来改动量很少&#xff0c;这仅针对软件驱动方式。…

【Java基础教程】(四十六)IO篇 · 下:System类对IO的支持:错误输出、信息输出、系统输入,字符缓冲流、扫描流和对象序列化流~

Java基础教程之IO操作 下 &#x1f539;本节学习目标1️⃣ System类对 IO 的支持1.1 错误输出&#xff1a;System.err1.2 信息输出&#xff1a;System.out1.3 系统输入&#xff1a;System. in 2️⃣ 字符缓冲流&#xff1a;BufferedReader3️⃣ 扫描流&#xff1a;Scanner4️⃣…

【Latex】官方文档教你长公式对齐方法

具体请参见下面链接 Aligning equations with amsmath - Overleaf, Online LaTeX Editor 详细介绍了各种公式的对齐方式&#xff0c;特别是 长公式的换行方法 以及多公式排列情况&#xff1a;

ctfshow-web2

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 最简单的SQL注入0x02 Write Up 这道题很多wp&#xff0c;但是为了完整性还是写一下 知道这里是sql注入&#xff0c;确认一下是什么类型的闭合 使用a or 11 #进行测试 可以知道闭合是单引号闭合&#xff0c;然后查一下显示的…

openGauss学习笔记-20 openGauss 简单数据管理-DISTINCT

文章目录 openGauss学习笔记-20 openGauss 简单数据管理-DISTINCT20.1 语法格式20.2 参数说明20.3 示例 openGauss学习笔记-20 openGauss 简单数据管理-DISTINCT DISTINCT关键字与SELECT语句一起使用&#xff0c;用于去除重复记录&#xff0c;只获取唯一的记录。 当一个表中有…

【python中级】 base64编码将图片数据转化为成字符串

【python中级】 base64编码将图片数据转化为成字符串 1、背景2、图片base64编码1、背景 在Qt编程的时候,有的地方比如logo需要加载图片,在程序打包之后,需要将图片拷贝进项目。 能不能将图片转化成一串字符串,使用该字符串代替图像地址。 即这样就可以字符串变量的形式编…

Terraform学习日记-AWS-EC2

terraform install https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli 这里我们使用 aws-linux-2022 作为执行环境 # sudo yum install -y yum-utils# sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/…

选择合适的图表,高效展现数据魅力

随着大数据时代的来临&#xff0c;数据的重要性愈发凸显&#xff0c;数据分析和可视化成为了决策和传递信息的重要手段。在数据可视化中&#xff0c;选择合适的图表是至关重要的一环&#xff0c;它能让数据更加生动、直观地呈现&#xff0c;为观众提供更有说服力的信息。本文将…

从娱乐产品到效率工具,ARknovv首款AR眼镜回归“AR本质”

如果说2022年是AR的元年&#xff0c;2023年则有望成为消费级AR眼镜的新拐点。 今年AR眼镜行业发展明显加快&#xff0c;且不断有大厂入局&#xff1a;今年2月小米发布无线AR眼镜探索版&#xff1b;3月荣耀也推出了一款全新的观影眼镜&#xff1b;而苹果在6月发布的MR头显Visio…

【java】2208. 将数组和减半的最少操作次数

给你一个正整数数组 nums 。每一次操作中&#xff0c;你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。&#xff08;注意&#xff0c;在后续操作中你可以对减半过的数继续执行操作&#xff09; 请你返回将 nums 数组和 至少 减少一半的 最少 操作数。 示例 1&#…

Android性能优化之游戏的Theme背景图

近期&#xff0c;对游戏的内存优化&#xff0c;通过内存快照发现&#xff0c;某个Activity的theme背景图 占用3M 多。考虑着手对齐进行优化。 问题 查看游戏中的内存快照&#xff0c;发现有一个图片bitmap 占用3M 多&#xff0c;设置在Activity的背景中&#xff1a; 查看Phon…

用户档案与用户画像:很容易混淆

用户档案与用户画像&#xff1a;很容易混淆 需求分析或设计需要梳理 趣讲大白话&#xff1a;搞清楚怎么来&#xff0c;才能用好 【趣讲信息科技236期】 **************************** User Profile&#xff0c;不知道谁提出来的。被译为用户档案或用户简要&#xff0c;它是基于…

一篇文章搞定《APP的启动流程》

一篇文章搞定《APP的启动流程》 前言冷启动、温启动、热启动启动中的重要成员简介zygote进程InstrumentationSystemServer进程ActivityManagerServiceBinderActivityThread 启动的步骤详解一、点击桌面图标二、创建进程三、初始化APP进程四、APP进程与System_server的绑定五、初…

《深度解析Docker与微服务架构:构建灵活可扩展的现代应用》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【SQL语句复习】第1-2章

SQL复习 学习目标&#xff1a;复习SQL语句 学习地址&#xff1a;https://linklearner.com/learn/detail/70 第一章 初始数据库 数据库是将大量数据保存起来&#xff0c;通过计算机加工而成的可以进行高效访问的数据集合。该数据集合称为数据库&#xff08;Database&#xf…

大学生用一周时间给麦当劳做了个App(Vue版)

背景 有个大学生粉丝最近私信联系我&#xff0c;说基于我之前开源的多语言项目做了个仿麦当劳的项目&#xff0c;虽然只是个样子货&#xff0c;但是收获颇多&#xff0c;希望把自己写的代码开源出来供大家一起学习进度。这个小伙伴确实是非常积极上进&#xff0c;很多大学生&a…

C盘空间不足:解决办法完整教程

当C盘空间不足时&#xff0c;你可以尝试以下几种解决方案&#xff1a; 1. 清理临时文件&#xff1a;使用Windows自带的磁盘清理工具&#xff0c;可以删除临时文件、回收站中的文件和其他不必要的系统文件&#xff0c;释放一些空间&#xff0c;推荐使用工具分区助手。 2. 卸载不…

数据库版本管理工具Flyway入门实战

From version control to continuous delivery, Flyway helps individuals, teams, and enterprises build on application delivery processes to automate database development. 1.引言 在项目开发中&#xff0c;一直在探索如何进行数据库的版本管理。关注的公众号推送了…