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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、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.mfbz.cn/a/44619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring-cloud-alibaba——nacos-server搭建

前言&#xff1a;组件版本关系&#xff0c;官方:组件版本关系 1,nacos-server搭建&#xff08;windows环境&#xff09;&#xff0c;下载地址nacos 选择对应的版本&#xff0c;这里以目前最新版2.2.3为例子,下载后解压 单机模式 修改\nacos-server-2.2.3\nacos\bin\startup.c…

分布式调用与高并发处理 Nginx

一、初识Nginx 1.1 Nginx概述 Nginx是一款轻量级的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。Nginx 专为性能优化而开发&#xff0c;使用异步非阻塞事件驱动模型。 常见服务…

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述

SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…

【Linux Shell】基础知识

Linux Shell基础知识 一、Linux Shell基础概念1.1 Shell定义1.2 命令行提示符 二、初识Shell2.1 Shell定义2.2 登录Shell相关文件2.3 Shell中的变量变量类型变量的引用单引号\ 与双引号\" \"变量的删除与检查 2.4 Shell中的扩展大括号扩展{ }其他扩展 一、Linux Shel…

使用springboot进行后端开发100问

properties和yaml文件怎么互转 安装插件 properties文件和yaml文件区别 properties 文件通过“.”和“”赋值&#xff0c;值前不加空格&#xff0c;yaml通过“:”赋值&#xff0c;值前面加一个空格&#xff1b;yaml文件缩进用空格&#xff1b; properties只支持键值对&#x…

flash attention 2论文学习

flash attention作者Tri Dao发布了flash attention 2&#xff0c;性能为flash attention的2倍。 优化点主要如下&#xff1a; 一、减少 non-matmul FLOPs A00中由于tensor core的存在&#xff0c;使得gpu对于浮点矩阵运算吞吐很高&#xff0c;如FP16/BF16可以达到312 TFLOPs/…

LINUX中的myaql(一)安装

目录 前言 一、概述 二、数据库类型 三、数据库模型 四、MYSQL的安装 &#xff08;一&#xff09;yum安装MYSQL &#xff08;二&#xff09;rpm安装MYSQL 五、MYSQL本地登录 rpm安装MYSQL本地登录 六、重置密码 总结 前言 MySQL是一种常用的开源关系型数据库管理系统&#xff…

蛋白质分子结构设计

paper read 1 Created by: 银晗 张 Created time: May 27, 2023 3:47 PM Tags: Product 补充了解蛋白质的生物学知识学习一下Diffusion的原理 &#x1f4a1; Method & Innovations Framework Summary: first deep learning models to perform antibody sequence-stru…

banner轮播图实现、激活状态显示和分类列表渲染、解决路由缓存问题、使用逻辑函数拆分业务(一级分类)【Vue3】

一级分类 - banner轮播图实现 分类轮播图实现 分类轮播图和首页轮播图的区别只有一个&#xff0c;接口参数不同&#xff0c;其余逻辑完成一致 适配接口 export function getBannerAPI (params {}) {// 默认为1 商品为2const { distributionSite 1 } paramsreturn httpIn…

pearcmd.php文件包含妙用

文章目录 pearcmd.php文件包含妙用利用条件原理利用config-createinstalldownload pearcmd关键词被ban参考 pearcmd.php文件包含妙用 利用条件 php.ini中register_argc_argvOn开启安装pecl/pear pecl是PHP中用于管理扩展而使用的命令行工具&#xff0c;而pear是pecl依赖的类…

从新手到专业人士:探索 C++ STL 以获得终极性能

探索 C STL 以获得终极性能 博主简介一、引言二、C STL 简介2.1、STL 是什么&#xff1f;2.2、STL 中的常用组件2.3、STL 的优点 三、入门指南&#xff1a;了解基本概念和用法3.1、容器&#xff1a;vector、list、deque、set、map 等3.2、算法&#xff1a;查找、排序、遍历等3.…

Javascript程序异常处理

什么是异常&#xff0c;异常就是我们在编写Javascript程序时出现的一些错误&#xff0c;并会在控制台中抛出这个错误&#xff0c;出现异常其实并不是一件坏事&#xff0c;相对的呢它可以提醒我们开发人员哪里出现了错误&#xff0c;方便我们后续的修改&#xff0c;能让我们的代…

OSI 和 TCP/IP 网络分层模型详解(基础)

OSI模型: 即开放式通信系统互联参考模型&#xff08;Open System Interconnection Reference Model&#xff09;&#xff0c;是国际标准化组织&#xff08;ISO&#xff09;提出的一个试图使各种计算机在世界范围内互连为网络的标准框架&#xff0c;简称OSI。 OSI 七层模型 OS…

centos逻辑分区磁盘扩展

最近碰到服务器磁盘空间不足&#xff0c;需要扩展逻辑分区的需求&#xff0c;特地做下小笔记&#xff0c;方便后续自己回忆。下图是磁盘的相关概念示意图&#xff1a; 1、查看磁盘空间 [rootlocalhost ~]# df -h #查看磁盘空间&#xff0c;根分区的大小是18G&#xff0c;已经用…

RISCV -3 RV32I/RV64I基本整型指令集

RISCV -3 RV32I/RV64I基本整型指令集 1 RV32I Base Integer Instruction Set1.1 Programmers’ Model for Base Integer ISA1.2 Base Instruction Formats1.3 Immediate Encoding Variants1.4 Integer Computational Instructions1.4.1 Integer Register-Immediate Instruction…

深入浅出多种开发语言对接淘宝京东1688阿里巴巴等电商平台,获取实时商品详情数据API接口介绍

api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口&#xff0c;可以帮助API使用者更好地了解、使用和集成&#xff0c;同时帮助人们有效地维护它每个产品都需要使用手册&#xff0c;API也不例外在API领域&#xff0c;可以将设计视为服务器和客户端之…

iPortal 注册登录模块扩展开发

作者&#xff1a;yx 文章目录 前言一、示例代码简介二、对接 iPortal REST API 接口2.1、登录模块扩展开发2.2、注册模块扩展开发 三、页面内容及样式实现四、配置启用定制页面 前言 针对注册登录模块&#xff0c;iPortal 允许用户通过 iFrame 方式接入自行开发的页面&#xf…

pytorch安装GPU版本 (Cuda12.1)教程: Windows、Mac和Linux系统快速安装指南

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

语言尽头的奇幻旅程:如何求解最后一个单词的长度?

本篇博客会讲解力扣“58. 最后一个单词的长度”的解题思路&#xff0c;这是题目链接。 以示例2为例&#xff1a;s " fly me to the moon " 首先&#xff0c;找到字符串末尾的\0。s一开始指向首字符f&#xff0c;我们从这个位置开始&#xff0c;向后遍历&#xff0c…

基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 2.1 Python 2.2 Matlab &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、文章讲解 &#x1f4a5;1 概述 文献来源&#xff1a; 摘要&#xff1a;对任意来流条件下的风电场发电功率进行准确预测,是提高电网对风电…