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

2023-07-15 10:20:23

在这里插入图片描述

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

  • 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。

一、题目描述

在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。

每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。

二、输入描述

第一行为一个数N,表示路灯个数,1<=N<=100000。

第二行为N个空格分隔的数,表示路径的照明半径,1<=照明半径<=100000*100。

三、输出描述

第一个路灯和最后一个路灯之间,无法照明的区间的长度和。

四、解题思路

题目要求计算第一个路灯和最后一个路灯之间无法照明的区间的长度和。

例如:

3
20 70 30
路灯1 覆盖0-20
路灯2 覆盖30-170
路灯3 覆盖170-230

没被覆盖的区间只有20~30。

所以输出10。

在这里插入图片描述
但是,如果路灯的照明范围大于100,怎么办?

特别鸣谢:感谢fly晨发现这个问题,并提供更优质的算法。

在这里插入图片描述

在这里插入图片描述

解题思路如下:

  1. 获取输入的灯数量;
  2. 通过Java8 Steam加载n个路灯的照明半径;
  3. 定义allResList,存储每个灯的照明范围;
  4. 定义maxRight,计算第一个灯和最后一个灯的距离;
  5. 将每个灯的照明范围放入一个集合中(左起点,右终点);
  6. 将每个灯的照明范围按照左起点进行升序排序;
    • 先按左边最小距离排序;
    • 如果左边距离相等的情况下 按照右边距离最小的排序;
  7. 当前节点和下一个节点做比较;
    • 用当前节点的右边照明范围和下一个节点的左边照明范围比较;
    • 大于的情况下 需要将下一个节点的右边距离取两个节点的最大值;
    • 说明两个节点之间存在黑暗距离;
  8. 输出黑暗距离之和totalBlack;

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int lightNum = sc.nextInt();
    // 获取输入的灯数量
    sc.nextLine();
    // n个路灯的照明半径
    List<Integer> allLightLength = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).boxed().collect(Collectors.toList());

    // 每个灯的照明范围
    List<List<Integer>> allResList = new ArrayList<>();

    // 计算第一个灯和最后一个灯的距离
    int maxRight = (lightNum - 1) * 100;

    // 将每个灯的照明范围放入一个集合中
    for (int i = 0; i < allLightLength.size(); i++) {
        // 当前灯的照明范围,左起点,右终点
        List<Integer> currentList = new ArrayList<>();
        // 左起点,注意左边范围不要小于总范围的最小长度
        Integer left = Math.max(0, i * 100 - allLightLength.get(i));
        // 右终点,注意右边范围不要大于总范围的最大长度
        Integer right = Math.min(maxRight, i * 100 + allLightLength.get(i));
        currentList.add(left);
        currentList.add(right);
        allResList.add(currentList);
    }

    // 将每个灯的照明范围按照左起点进行升序排序
    allResList = allResList.stream().sorted((list1, list2) -> {
        Integer oneLeft = list1.get(0);
        Integer twoLeft = list2.get(0);
        // 先按左边最小距离排序
        if (!oneLeft.equals(twoLeft)) {
            return oneLeft - twoLeft;
        }
        // 如果左边距离相等的情况下  按照右边距离最小的排序
        return list1.get(1) - list2.get(1);
    }).collect(Collectors.toList());

    int totalBlack = 0;
    // 当前节点和下一个节点做比较
    for (int i = 0; i < lightNum - 1; i++) {
        List<Integer> currentList = allResList.get(i);
        List<Integer> nextList = allResList.get(i + 1);

        // 用当前节点的右边照明范围和下一个节点的左边照明范围比较
        if (currentList.get(1) >= nextList.get(0)) {
            // 大于的情况下 需要将下一个节点的右边距离取两个节点的最大值
            nextList.set(1, Math.max(currentList.get(1), nextList.get(1)));
            continue;
        }
        // 说明两个节点之间存在黑暗距离
        int currentBlackLength = nextList.get(0) - currentList.get(1);
        totalBlack += currentBlackLength;
    }

    System.out.println(totalBlack);
}

六、效果展示

1、输入

4
20 70 175 10

2、输出

5

3、思路

在这里插入图片描述

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

更多推荐

CPP-Templates-2nd--第 21 章 模板和继承

目录21.1空基类优化(TheEmptyBaseClassOptimization,EBCO)21.1.1布局原则21.1.2将数据成员实现为基类21.2TheCuriouslyRecurringTemplatePattern(CRTP)21.2.1TheBarton-NackmanTrick21.2.2运算符的实现(

客户端和服务端信息交互模型

什么是客户端和服务端?客户端:可以向服务器发请求,并接收返回的内容进行处理服务器端:能够接收客户端请求,并且把相关资源信息返回给客户端的当用户在地址栏中输入网址,到最后看到页面,中间都经历了什么?后面会详细解析每个步骤干的事一、URL地址解析A:URI/URL/URNURI(UniformResourceldentif

云服务部署:AWS、Azure和GCP比较

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

【腾讯云 Cloud Studio 实战训练营】提升开发效率与协作:探索腾讯云 Cloud Studio 的强大功能与优势

文章目录一、前言二、认识腾讯云CloudStudio2.1什么是云端开发环境2.2CDE的特点与优点2.2.1提高效率,开发环境一键运行2.2.2提高生产力,可以并行的工作2.2.3开发更加规范2.2.4提供监管,降低资本与资源2.3云端开发环境具备的四大要素2.4腾讯云CloudStudio强大的AI功能2.4.1与

tauri vue vite elemrntui

tauri+vue+viterust```根据https://www.rust-lang.org/tools/install,安装rust。如果是windows会跳出vs工具的安装器,会自动勾选要安装的,直接点安装即可执行cargo--version检查安装是否完成,可以使用cargo创建一个hello项目验证rust

OpenCV中的HoughLines函数和HoughLinesP函数到底有什么区别?

一、简述基于OpenCV进行直线检测可以使用HoughLines和HoughLinesP函数完成的。这两个函数之间的唯一区别在于,第一个函数使用标准霍夫变换,第二个函数使用概率霍夫变换(因此名称为P)。概率版本之所以如此,是因为它仅分析点的子集并估计这些点都属于同一条线的概率。此实现是标准霍夫变换的优化版本,在这种情况

Go语言实践案例之简单字典

一、程序要实现效果:在命令行调用程序的时候,可以在命令行的后面查询一个单词,然后会输出单词的音标和注释。二、思路分析:定义一个结构体DictRequest,用于表示翻译请求的数据结构。其中包含了TransType(翻译类型)、Source(源语言单词)、UserID(用户ID)等字段。定义一个结构体DictRespon

GO编程实践:如何高效使用变量

GO语言是一种强类型、静态编译的编程语言,它具有简洁的语法和强大的并发支持。在GO语言中,变量的定义和使用是非常重要的基本概念之一。下面是关于如何在GO语言中定义变量的详细说明,使用Markdown格式呈现:GO语言变量定义在GO语言中,变量的定义涉及到两个关键步骤:声明和初始化。首先,我们需要声明变量的类型,然后可以

MyBatis核心配置文件解析: 一步步深入理解mybatis-config.xml

😀前言在进行MyBatis项目开发时,合理和高效的配置是确保项目顺利进行的基础。其中,mybatis-config.xml配置文件扮演着极其重要的角色,它包含了MyBatis运行时的各种必要配置信息,如数据库连接属性、事务管理器配置、别名配置等。.提供了一份详细的mybatis-config.xml配置文件解析,一步

Go语言开发环境搭建指南:快速上手构建高效的Go开发环境

Go官网:https://go.dev/dl/Go语言中文网:https://studygolang.com/dl下载Go的语言包进入官方网站Go官网或Go语言中文网:选择下载对应操作系统的安装包:等待下载完成:安装Go的语言包双击运行上一步下载好的Go语言包,点击【Next】:勾选【Iacceptthetermsin

深入了解接口测试:方法、工具和关键考虑因素(一)

接口测试是软件测试中的一项重要工作,它涉及到系统与系统之间的交互点。接口可以是外部接口,也可以是内部接口,包括上层服务与下层服务接口以及同级接口。在接口测试中,我们需要确保接口能够按照预期的方式进行通信和交互,并且能够正确处理输入和输出数据。什么是接口?接口是具有特定输入和输出的一套逻辑处理单元,它不需要了解内部的实现

热文推荐