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

news2024/11/18 9:27:20

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
      • 特别鸣谢:感谢fly晨发现这个问题,并提供更优质的算法。
      • 解题思路如下:
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、思路

专栏导读

本专栏收录于《华为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在线答疑。

在这里插入图片描述

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

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

相关文章

【USRP X310】如何查找USRP X310的 LabVIEW 案例 Demo

环境 Windows 10LabVIEWUSRP 支持的硬件 USRP-2900USRP-2901USRP-2920USRP-2921USRP-2922USRP-2930USRP-2932USRP-2940 40 MHzUSRP-2940 120 MHzUSRP-2942 40 MHzUSRP-2942 120 MHzUSRP-2943 40 MHzUSRP-2943 120 MHzUSRP-2944USRP-2945USRP-2950 40 MHzUSRP-2950 120 MHzUS…

轻奢分销商城pc/h5小程序开源版开发

轻奢分销商城pc/h5小程序开源版开发 商城系统&#xff1b;包含小程序商城、H5商城、公众号商城、PC商城、App&#xff0c;支持秒杀、优惠券、积分、分销、会员等级。 功能列表&#xff1a; 用户注册和登录&#xff1a;用户可以通过手机号码或第三方登录方式注册和登录账号。…

RPM包详解以及如何制作RPM包

RPM包简介 RPM 全名 RedHat Package Managerment&#xff0c;一开始只是Red Hat Linux的软件包格式&#xff0c;它最初的名字为Red Hat软件包管理程序。从那以后&#xff0c;RPM逐渐称为许多其他Linux发行版所接受的一种软件包格式。Linux标准化规范将RPM作为其官方软件包格式…

gdb调试产生code文件以及遇到的“file format not recognized”问题解决

一、调试 core 文件的配置 1.1 开启core文件 —— ulimit 有时候&#xff0c;服务器程序运行一段时间后会突然崩溃&#xff0c;这并不是我们希望看到的&#xff0c;需要 解决这个问题。只要程序在崩溃的时候有 core 文件产生&#xff0c;就可以使用这个 core 文件 来定位崩溃…

数据结构(王道)——线性表的存储结构之双链表

双链表和单链表的对比 一、从无到有创建一个双链表及其基础操作 带头结点 的双链表 初始化 双链表的后插操作&#xff1a; 从后插可以拓展到按位序插入&#xff0c;和前插操作。 因为双链表的特性&#xff0c;如果按位序插入或者前插操作&#xff0c;只需要找到插入的位置的前…

传统企业的数据管理:如何高效管理分散的数据?

在数字时代&#xff0c;数据管理已经成为一个重要的议题。大多数企业已经意识到数据是他们业务运营的重要组成部分。然而&#xff0c;许多传统企业还在使用过时的数据管理模式&#xff0c;这些模式并不具备高效管理分散数据的能力。随着企业的膨胀和数据规模的逐渐增加&#xf…

AI工程师:未来时代的主流工程师

自从以ChatGPT为主的人工智能&#xff08;AI&#xff09;大模型层出不穷&#xff0c;越来越多人开始意识到AI的潜力&#xff0c;甚至预测“所有行业都将通过AI来进行重塑”&#xff0c;正是基于该原因&#xff0c;各国各企业如火如荼建设AI事业&#xff0c;作为把AI造出来的AI工…

配合LaTex使用的“工具”

先介绍两个工具&#xff0c;比如公式的书写等&#xff0c;会大大提高书写论文的速度。 第一个&#xff1a;Mathpix Snip(生成公式)。官网&#xff1a;https://mathpix.com 【先去官网注册一个账号&#xff08;注册时遇到的问题见文章Mathpix上半部分&#xff09;然后去安装该软…

Python 列表 pop()函数使用详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 pop函数使用详解 1、按照索引删除元素1.1、正数索引1.2、负数索引1.3、不指定索引…

docker k8s

Docker docker到底与一般的虚拟机有什么不同呢&#xff1f; 我们知道一般的linux系统即GNU/Linux系统包括两个部分&#xff0c;linux系统内核GNU提供的大量自由软件&#xff0c;而centos就是众多GNU/Linux系统中的一个。 虚拟机会在宿主机上虚拟出一个完整的操作系统与宿主机完…

vue+openlayers 点击地图查询geoserver发布的WMS/WMTS图层的信息[矢量(点、线、面)+栅格]

一、基本介绍 网络地图服务 (WMS) 、网络地图切片服务 (WMTS) &#xff0c;根据用户的请求返回相应的地图&#xff08;包括PNG&#xff0c;GIF&#xff0c;JPEG等栅格形式或者是SVG和WEB CGM等矢量形式&#xff09;。 下面是常见的geoserver发布的图层格式&#xff0c;有矢量…

ODX(ISO22901)进阶——Intorduction to ODX

文章目录 前言一、Vehicle Diagnostic是什么?二、Diagnostic Data in ODX(诊断数据在ODX数据库)三、ODX企标概述(ODX Authoring Guidelines)总结前言 今天是2023年7月15日,距离2024年只剩下半年时间。伴随着各地疫情政策逐渐发开,三年的疫情终于迎来了不一样的变化。期…

AI绘画Stable Diffusion实战操作: 62个咒语调教-时尚杂志封面

今天来给大家分享&#xff0c;如何用sd简单的咒语输出好看的图片的教程&#xff0c;今天做的是时尚杂志专题&#xff0c;话不多说直入主题。 还不会StableDiffusion的基本操作&#xff0c;推荐看看这篇保姆级教程&#xff1a; AI绘画&#xff1a;Stable Diffusion 终极炼丹宝…

C++并发编程(1):基本概念、线程管控

学习视频与书籍 学习视频 c11并发与多线程视频课程 学习书籍 我本来打算去图书馆借《C新经典》的&#xff0c;偶然发现这本书&#xff0c;如获至宝 书挺新的&#xff0c;我看译者序是21年10月这本书挺贵的&#xff0c;后面写着139.80&#xff0c;大家还是去图书馆借吧作为基础…

Linux驱动之字符设备驱动框架与示例模板

目录 一、字符设备驱动简介 二、字符设备驱动开发步骤 1.确定设备号 2.定义 file_operations 结构体 3.实现操作函数 4.注册和注销字符设备 5.编译和加载模块 6.用户空间交互&#xff1a; 三、字符设备驱动示例模板 四、字符设备驱动开发总结 一、字符设备驱动简介 字…

未来Mac下载站怎么打不开了

重要公告&#xff1a; 未来软件园因业务需要现更换域名 原域名&#xff1a;Mac.orsoon.com 更为新域名&#xff1a;未来mac下载-Mac软件-mac软件下载-mac软件大全 程序已全面转移&#xff0c;请访问新域名

MySQL中的索引和事务 (数据库系列5)

目录 前言&#xff1a; 1.索引 1.1 索引的概念 1.2索引的作用 1.3索引的使用场景 1.4索引的使用 1.4.1查看索引 1.4.2创建索引 1.4.3删除索引 1.5索引背后的数据结构 1.5.1 B-树 1.5.2 B树 2.事务 2.1事务的概念 2.2数据库事务的四个特性 2.2.1原子性 2.2.2一…

城会玩,Selenium+Docker成功解决这一大难题

01、需求背景 日常测试中会遇到对web应用进行UI自动化的测试场景&#xff0c;一般常用的工具是使用Selenium&#xff0c;一套简单的UI自动化架构如下&#xff1a; 上图即为简单搭建的一套UI自动化测试架构&#xff0c;但 串行执行测试用例&#xff1a; 一台机器只能安装一个…

《英雄联盟》提示丢失D3DCompiler_43.dll的三个解决方法

在我们打开游戏《英雄联盟》的时候&#xff0c;计算机报错提示“由于找不到D3DCompiler_43.dll&#xff0c;无法继续执行此代码”&#xff0c;“D3DCompiler_43.dll丢失”是怎么回事呢&#xff1f;D3DCompiler_43.dll是一个Microsoft DirectX的组件文件&#xff0c;它是用于编译…

博客系统(使用前后端分离)

博客系统 前言一.准备工作1.1 准备好前端文件1.2 设计数据库1.3 编写基本的数据库代码1.4 封装好数据库的连接操作1.5 根据设计的表创建实体类1.6 根据实体类,提供一些简单的增删改查操作 二.博客要实现的功能2.1 博客列表页功能2.2 博客详情页2.3 博客登录页2.4 页面强制登录功…