算法题--华为od机试考试(执行时长、找数字、数据最节约的备份方法)

2024-05-25 12:12

本文主要是介绍算法题--华为od机试考试(执行时长、找数字、数据最节约的备份方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

执行时长

题目描述

输入描述

输出描述

示例1

输入

输出

说明

示例2

输入

输出

说明

解析

找数字

题目描述

输入描述

输出描述

示例1

输入

输出

示例2

输入

输出

示例3

输入

输出

解析

数据最节约的备份方法

题目描述

输入描述

输出描述

备注

示例1

输入

输出

示例2

输入

输出

解析


执行时长

考察理解能力

题目描述

为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,

假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成

输入描述

第一个参数为GPU一次最多执行的任务个数,取值范围[1,10000]

第二个参数为任务数组长度,取值范围[1,10000]

第三个参数为任务数组,数字范围[1,10000]

输出描述

执行完所有任务最少要要多少秒

示例1

输入

3

5

1 2 3 4 5

输出

6

说明

 一次最多执行3个任务,最少耗时6s。

示例2

输入

4

5

5 4 1 1 1

输出

5

说明

一次最多执行4个任务,最少耗时5s

解析

按顺序执行,每次用最多执行的任务个数减去当前的任务个数和上次剩余的个数,如果有剩余的任务未执行就留到下一次,

如果没有则下一次剩余的任务为0,最后剩下的任务直接除以最多执行的任务个数向上取整。

function executeTime(n, len, arr) {let tmp = 0for (let i = 0; i < len; i++) {if (n > arr[i]) {tmp = (tmp - n + arr[i]) < 0 ? 0 : (tmp - n + arr[i])} else {tmp = tmp + arr[i] - n}}return len + Math.ceil(tmp / n)}console.log(executeTime(3, 5, [1, 2, 3, 4, 5]))console.log(executeTime(4, 5, [5, 4, 1, 1, 1]))

找数字

考察二进制和十进制的转换

题目描述

小扇和小船今天又玩起来了数字游戏,

小船给小扇一个正整数 n(1 ≤ n ≤ 1e9),小扇需要找到一个比 n 大的数字 m,使得 m 和 n 对应的二进制中 1 的个数要相同,如:

4对应二进制100

8对应二进制1000

其中1的个数都为1个

现在求 m 的最小值。

输入描述

输入一个正整数 n(1 ≤ n ≤ 1e9)

输出描述

输出一个正整数 m

示例1

输入

128

输出

256

示例2

输入

6

输出

9

示例3

输入

5

输出

6

解析

将n转换为二进制,如果是所有的1在左边,0在右边,则需要进一位,例如111100 => 1000111。全为1也同样需要进一位。

其它情况从右到左,把第一个01交换顺序即可,例如1001 => 1010。最后将结果转为十进制的数字。

function getMin(n) {let arr = n.toString(2).split('').map(Number)for (let i = arr.length - 2; i > 0; i--) {if (arr[i] === 0 && arr[i + 1] === 1) {arr[i + 1] = 0arr[i] = 1return parseInt(arr.join(''), 2)}}arr = arr.sort((a, b) => a - b)arr[arr.indexOf(1)] = 0arr.unshift(1)return parseInt(arr.join(''), 2)
}
console.log(getMin(128))
console.log(getMin(6))
console.log(getMin(5))

数据最节约的备份方法

考察二分法、深度遍历、递归

题目描述

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

文件分布方式所有文件的大小都是整数的MB,且不超过500MB;文件不能分隔、分卷打包

输入描述

组文件大小的数据

输出描述

使用光盘的数量

备注

不用考虑输入数据不合法的情况;假设最多100个输入文件

示例1

输入

100,500,300,200,400

输出

3

示例2

输入

1,100,200,300

输出

2

解析

这里我们采用二分法确定最小使用光盘的数量。例如示例1有5组文件,这里我们先确认3个光盘是否可以装下,用深度遍历去分析,如果可以的话,再确认(1+3)/2=2个光盘

是否可以装下,不行的话,返回最小为3,可以的话继续上述操作。

这里关键在于dfs函数函数实现:

1.确定入参,1>当前所有光盘容量、2>组文件、3>当前需要装的序号。这里2、3是用来表示剩余的未装光盘数据,可以用一个数组表示,不过需要一直改变数组的长度大小。

2.确定f(x)和f(x-1)的关系。f(x)=f(x-1)0 || f(x-1)1 || ...。

当前这一次等于将x的数据依次放入所有光盘中取或,f(x-1)0表示把x的数据放入0号光盘中,只有有一组可以返回true即表示当前的光盘数量可以装下所有数据。

3.确定出口和剪枝,

    1>光盘容量+当前需要放下的数据小于等于500才能放入

    2>当放入的序号等于组文件数量是表示已全部放入,返回true

    3>当前的光盘和上一个光盘容量大小一样,故装入该光盘中和装入上一个光盘中无区别,可以跳过

    4>下一次循环前需还原光盘容量

function minCopy(str) {let arr = str.split(',').map(Number).sort((a, b) => b - a)let l = 1;let r = arr.length;let ans = r;// 二分模板while (l <= r) {const mid = Math.floor((l + r) / 2);if (check(mid, arr)) {ans = mid;r = mid - 1;} else {l = mid + 1;}}return ans;
}
// 返回bucket.length个光盘是否可以装下,bucket为光盘,num为未装的组文件,index为当前需要装的组文件序号
function dfs(buckets, nums, index) {// 所有组文件都已装入光盘中if (index === nums.length) {return true;}// 将序号为index的组文件依次递归放入bucket中for (let i = 0; i < buckets.length; i++) {// 剪枝,当前的光盘和上一个光盘容量大小一样,故装入该光盘中和装入上一个光盘中无区别,可以跳过if (i !== 0 && buckets[i] === buckets[i - 1]) {continue;}// 该光盘可以装下此组文件if (buckets[i] + nums[index] <= 500) {buckets[i] += nums[index]; //回溯// 找到结果后不再往下递归if (dfs(buckets, nums, index + 1)) {return true;}// 下一次循环前还原光盘容量buckets[i] -= nums[index];}}return false;
}// 返回是否能使用count个光盘备份数据
function check(count, nums) {const buckets = new Array(count).fill(0);return dfs(buckets, nums, 0);}
console.log(minCopy('100,500,300,200,400'))
console.log(minCopy('1,100,200,300'))

这篇关于算法题--华为od机试考试(执行时长、找数字、数据最节约的备份方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001466

相关文章

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6