✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2…Fn
。
随着时间的推移,所占存储会越来越大。
云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。
假设每块SATA盘容量为M,求能转储的最大连续文件大小之和。
2. 输入描述
第一行为SATA盘容量M,1000<=M<=1000000
第二行为区块链文件大小序列F1,F2…Fn。其中 1<=n<=100000, 1<=Fi<=500
3. 输出描述
求能转储的最大连续文件大小之和
4. 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();
int n = arr.length;
int l = 0;
int r = 0;
int curr = 0;
int ret = 0;
while (r < n) {
curr += arr[r];
if (curr <= M) {
ret = Math.max(ret, curr);
r ++;
} else {
curr -= arr[r];
curr -= arr[l];
l ++;
}
}
System.out.println(ret);
}
5. 测试
6.解题思路
- 读取输入的SATA盘容量M和区块链文件大小序列arr。
- 定义变量n为文件序列arr的长度,l和r分别表示连续文件的左右边界,curr表示当前连续文件大小之和,ret表示能转储的最大连续文件大小之和,初始值均为0。
- 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和。
- 将当前文件大小加到curr上。
- 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位。
- 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件。
- 将右指针r指向的文件大小从curr中减去。
- 将左指针l指向的文件大小从curr中减去。
- 左指针l向右移动一位。
- 输出能转储的最大连续文件大小之和ret。