华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2…Fn。
随着时间的推移,所占存储会越来越大。
云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。
假设每块SATA盘容量为M,求能转储的最大连续文件大小之和。
二、输入描述
第一行为SATA盘容量M,1000<=M<=1000000
第二行为区块链文件大小序列F1,F2…Fn。其中 1<=n<=100000, 1<=Fi<=500
三、输出描述
求能转储的最大连续文件大小之和
四、解题思路
- 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和;
- 将当前文件大小加到curr上;
- 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位;
- 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件;
- 输出能转储的最大连续文件大小之和ret;
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 每块SATA盘容量
int M = Integer.valueOf(sc.nextLine());
// 区块链文件大小序列
int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 序列arr的长度
int n = arr.length;
// 连续文件的左边界
int l = 0;
// 连续文件的右边界
int r = 0;
// 当前连续文件大小之和
int curr = 0;
// 能转储的最大连续文件大小之和
int ret = 0;
// 1、使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和。
while (r < n) {
// 2、将当前文件大小加到curr上
curr += arr[r];
// 3、如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
if (curr <= M) {
ret = Math.max(ret, curr);
r ++;
// 4、如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件。
} else {
// 4.1 将右指针r指向的文件大小从curr中减去
curr -= arr[r];
// 4.2 将左指针l指向的文件大小从curr中减去
curr -= arr[l];
// 4.3 左指针l向右移动一位
l ++;
}
}
// 5、输出能转储的最大连续文件大小之和ret
System.out.println(ret);
}
六、效果展示
1、输入
1000
100 300 500 400 400 150 100
2、输出
950
3、说明
最大序列和为950,序列为[400,400,150]。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。