华为OD机试真题B卷 JavaScript 实现【数据最节约的备份方法】,附详细解题思路

news2025/1/27 13:09:37

在这里插入图片描述

一、题目描述

有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB。

求使用光盘最少的文件分布方式,所有文件的大小都是整数的MB,且不超过500MB,文件不能分隔、分卷打包。

二、输入描述

每组文件大小的数据。

三、输出描述

使用光盘的数量。

四、解题思路

题目要求找出使用光盘最少的文件分布方式,使得所有文件都能被备份,每张光盘的容量为500MB。文件的大小都是整数的MB,且不超过500MB。

解题思路如下:

  1. 读取输入的每组文件大小的数据,并将其转换为整数数组;
  2. 对文件的大小进行升序排序,以便从小到大进行分配;
  3. 使用二分查找确定最少的光盘数量。
  • 初始化left为0,表示使用0个光盘;right为files.length + 1,表示使用files.length + 1个光盘(最坏情况);
  • 当left < right时,进行二分查找:
    • 计算mid为(left + right) / 2。
    • 调用cal方法判断是否可以将所有文件分布在mid个光盘中。
      • 在cal方法中,创建长度为mid的整数数组nums,用于记录每个光盘的剩余容量,初始值为500MB;
      • 从文件大小数组files的末尾开始遍历文件大小:
        - 对nums数组进行升序排序,以便从剩余容量最大的光盘开始分配;
        - 如果剩余容量最大的光盘可以容纳当前文件大小f,则将该文件分配给该光盘,并更新光盘的剩余容量;
        - 如果剩余容量最大的光盘无法容纳当前文件大小f,则返回false,表示无法将所有文件分布在当前的光盘数量中;
        - 如果能够将所有文件分布在当前的光盘数量中,则返回true。
        - 如果cal方法返回true,表示当前的光盘数量可以容纳所有文件,将right更新为mid。
        - 如果cal方法返回false,表示当前的光盘数量无法容纳所有文件,将left更新为mid + 1。
  1. 输出最终确定的光盘数量left。

解题思路分析:

该算法使用二分查找的思想确定最少的光盘数量。首先对文件的大小进行升序排序,然后在二分查找的过程中,通过调用cal方法判断当前的光盘数量是否可以容纳所有文件。在cal方法中,根据剩余容量最大的光盘逐个分配文件,并更新光盘的剩余容量。通过不断调整二分查找的左右边界,最终确定最少的光盘数量。算法的时间复杂度为O(log n),其中n为文件数量。

五、JavaScript算法源码

function calculate(input) {
    // 读取输入的文件大小数据
    const arr = input.split(' ');

    // 将文件大小数据转换为整数数组
    const files = arr.map(x => parseInt(x));

    /**
     * 判断是否可以将所有文件分布在m个光盘中
     * @param {Number} m 光盘数量
     * @return {Boolean} 是否可以分布在m个光盘中
     */
    function cal(m) {
        // 创建长度为m的整数数组,用于记录每个光盘的剩余容量,初始值为500MB
        const nums = new Array(m).fill(500);

        // 从文件大小数组的末尾开始遍历文件大小
        for (let i = files.length - 1; i >= 0; i--) {
            // 对nums数组进行升序排序,以便从剩余容量最大的光盘开始分配
            nums.sort((a, b) => a - b);

            // 获取当前文件大小
            const f = files[i];

            // 遍历光盘容量,寻找第一个可用容量大于等于f的光盘
            let j;
            for (j = 0; j < m; j++) {
                if (nums[j] >= f) {
                    break;
                }
            }

            // 如果不存在可用的光盘,则无法将所有文件分布在当前的光盘数量中
            if (j === m) {
                return false;
            }

            // 将当前文件分配给可用的光盘,并更新光盘的剩余容量
            nums[j] -= f;
        }

        // 如果能够将所有文件分布在当前的光盘数量中,则返回true
        return true;
    }

    // 对文件大小进行升序排序,以便从小到大进行分配
    files.sort((a, b) => a - b);

    // 使用二分查找确定最少的光盘数量
    let left = 0; // 表示使用0个光盘
    let right = files.length + 1; // 表示使用files.length + 1个光盘(最坏情况)
    while (left < right) {
        const mid = Math.floor((left + right) / 2); // 计算mid为(left + right) / 2
        if (cal(mid)) { // 如果当前的光盘数量可以容纳所有文件,将right更新为mid
            right = mid;
        } else { // 如果当前的光盘数量无法容纳所有文件,将left更新为mid + 1
            left = mid + 1;
        }
    }

    // 输出最终确定的光盘数量
    return left;
}

六、效果展示

1、输入

100 200 300 400 500

2、输出

3

3、说明

100 + 400、200 + 300 、500 三张光盘即可。

在这里插入图片描述


🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

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

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

在这里插入图片描述

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

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

相关文章

mysql服务器启动和关闭

Windows 系统下启动停止 MySQL 服务的方式主要有以下两种&#xff1a; 通过计算机管理方式通过CMD命令行方式 备注: 测试数据库版本为MySQL5.7。 安装mysql服务器版本5.7成功&#xff0c;且加入系统变量成功之后&#xff0c;按照以下步骤启动/停止服务器。 一、通过计算机管…

Xubuntu22.04之绘制正弦波(一百七十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

测试人生 | 三十而已,何需惧怕!年薪40W+涨薪幅度超40%

关于我&#xff0c;普通二本&#xff0c;非计算机专业&#xff0c;培训出身&#xff0c;北漂&#xff0c;五年多的工作经验&#xff0c;做过外包&#xff0c;中间有过频繁的跳槽经历&#xff0c;手工点点点为主&#xff0c;最近确认了新Offer&#xff0c;远程办公&#xff0c;涨…

G - 1-n数组

第四次题组 [Cloned] - Virtual Judge (vjudge.net) 【题目描述】 给你一个数组一个a[n]组成n正整数。您可以对其执行操作。 在一个操作中&#xff0c;您可以替换数组的任何元素一个我​跟⌊/2​​⌋ 看看您是否可以多次应用该操作&#xff08;可能操作为0&#xff09; 来制…

Apache Commons CSV 基本使用

Apache Commons CSV 基本使用 文章目录 Apache Commons CSV 基本使用一、概述1、简介2、主要特点3、官方资料 二、基本使用1、引入依赖2、读取 .csv 文件文件内容读取文件 3、写入文件写入文件写入结果 一、概述 1、简介 Apache Commons CSV是Apache软件基金会的一个开源项目…

Android——认识Android (Android发展简介)(一)

如果想要学习好Android开发&#xff0c;首先需要能够熟练应用以下的几个知识&#xff1a; JavaSE : 理解面向对象&#xff0c;掌握网络通信&#xff0c;掌握集合&#xff0c;掌握IO操作&#xff0c;要懂得图形化界面swing。 JavaEE&#xff1a;也需要一定的了解&#xff0c;以…

mysql简单入门常见的语句使用

一、安装mysql 二、数据库操作 1、进入本地数据库 win r 运行cmd.exe 输入命令 mysql -uroot -p 敲回车&#xff1b;随后输入密码&#xff1b; -u用户名 -p密码; 1.1 连接远程数据库:mysql -h ip地址 -u 用户名 -p mysql -h 10.10.25.159 -u root -p root-h主机名…

git push 报错 error: src refspec master does not match any 解决

真是TN的邪了门了&#xff0c;今天在Gitee上创建了一个新项目&#xff0c;然后要把本地的代码push上去时&#xff0c;报了如下错误&#xff1a; ➜ *** git:(main) git push -u origin "master" error: src refspec master does not match any error: failed to pu…

Windows上通过CMake编译COLMAP源码操作步骤

COLMAP源码&#xff1a;https://github.com/colmap/colmap &#xff0c;最新的稳定版本位于master分支&#xff0c;最新的开发版本位于dev分支&#xff0c;这里使用master分支进行编译&#xff0c;commit id为1555ff0。官方推荐使用vs2019&#xff0c;使用vs2022有一些已知bugs…

Metasploit介绍

Metasploit介绍 我们经常在电影里看到有关黑客的镜头&#xff0c;他们通常在几个屏幕上一顿操作就能轻松“黑“进各种系统。这样的场景是不是很熟悉&#xff0c;是不是很羡慕&#xff1f; 今天我来介绍一下Metasploit Framework&#xff0c;简称MSF。这个工具就可以做到“Hacki…

Qt5.12.6配置Android Arm开发环境(windows)

1. 安装jdk1.8 2.安装Android Studio 并安装 SDK 与NDK SDK Tools 选择 26.0.3 SDK Platform 选择 Android SDK Platform 26 NDK选择19版本 安卓ARM环境配置成功如下: JDK1.8 , SDK 26 , NDK 19 在安装QT时要选择 ARMv7(32位CPU)与ARM64-v8a(64位CPU) 选择支持android平台…

全国各个省份市区县明细数据

全国总共有23个省、5个自治区、4个直辖市、2个特别行政区。 此数据包含省、市、区、县数据&#xff0c;共2886个。——更新于2023年6月10日 费了不少时间&#xff0c;暂时应该没有比我更全的了~~~细致到区县了 包括台湾省&#xff1a;台北市,新北市,桃园市,台中市,台南市,高…

计算机网络-子网划分

计算机网络-子网划分与CRC差错校验 文章目录 计算机网络-子网划分与CRC差错校验IP地址的分类A类地址B类地址C类地址D类地址和E类地址和特殊IP地址子网掩码实战&#x1f4aa; IP协议是 TCP/IP体系中最主要的协议之一&#xff0c;也是最重要的互联网协议之一。 IP协议是32位&am…

ubuntu22.04.2安装onlyoffice(不更改默认端口版)

目录 一、配置阿里源 二、postgresql数据库 &#xff08;一&#xff09;安装postgresql &#xff08;二&#xff09;创建postgresql数据库和用户 三、安装 rabbitmq 四、安装nginx-extras 五、安装ONLYOFFICE Docs &#xff08;一&#xff09;Add GPG key &#xff08…

【html总结--详细版】

目录 一、html 常用的标签 二、列表分为有序列表、无序列表、自定义列表 有序列表&#xff1a; 无序列表&#xff1a; 自定义列表&#xff1a; 三、hr 四、特殊符号 五、div和span 六、图片的属性 七、超链接 八、table表格的基本结构 table的属性 tr的属性 td的属性…

(七)CSharp-刘铁锰版-事件

一、初步了解事件 定义&#xff1a;单词 Event &#xff0c;译为“事件” 《牛津词典》中的解释是“a thing that happens,especially something important”通顺的解释就是“能够发生的什么事情” 角色&#xff1a; 使对象或类具备通知能力的成员 &#xff08;中译&#x…

数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)

项目需求 录入进入房间的相关数据&#xff1b;从进入时间开始计时&#xff0c;计算滞留房间的时间&#xff1b;定时刷新数据&#xff0c;超过30分钟的人数&#xff0c;进行红色告警&#xff1b; 实现流程 为了完整地实现上述需求&#xff0c;我们可以按照以下步骤开发&#…

Log4j2漏洞复现补丁绕过

漏洞复现 这里我一共使用了两个jdk版本 8u202的情况比较特殊&#xff0c;其实我今天凌晨在家里用的也是8u202的版本&#xff0c;失败了。今天来公司也是用的8u202版本的jdk&#xff0c;成功了。我仔细研究了两者的不同&#xff0c;我发现唯一不同的就是我公司这个idea启的proie…

NLP——分布式语义 Distributional Semantics:Word Vectors;Word2Vec

文章目录 传统语义数据集的缺点分布式语义Word Vectors 词向量Count-based 基于统计的方法Document 作为上下文 —— 向量空间模型&#xff08;VSM&#xff09;TF-IDF 更加有效的编码方式降维Singular Value Decomposition neighbor words 作为上下文 基于深度学习的方法Word2V…

highlight clock tree 高亮时钟树的方法

当分析clock tree需要在图形界面highlight clock tree时&#xff0c;最朴实无华的方法就是贴报告&#xff0c;除此之外这里也分享一下用命令的方法。 1.Imported Path Pins 1&#xff09;Highlight > Color By > Imported Path Pins 2&#xff09;report_timing icc2…