华为OD机试 - 区块链文件转储系统(Python/JS/C/C++ 2024 E卷 200分)

【华为OD机试真题 java、python、c++、JsNode】区块链文件转储系统(100%通过+复盘思路) 区块链底层存储是一个链式文件系统,由顺房的N个文件组成,每个文件的大小不一,依次为F1,F2...Fn。随着时自的推移,所占存储会越来越大。 云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。 假设每块SATA盘容量为M,求能转储的最大连续文件大小之和。 阅读详情

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

一、题目描述

区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2…Fn。

随着时间的推移,所占存储会越来越大。

云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。

假设每块SATA盘容量为M,求能转储的最大连续文件大小之和。

二、输入描述

第一行为SATA盘容量M,1000<=M<=1000000

第二行为区块链文件大小序列F1,F2…Fn。其中 1<=n<=100000, 1<=Fi<=500

三、输出描述

求能转储的最大连续文件大小之和

四、测试用例

1、输入

1000
100 300 500 400 400 150 100

2、输出

950

3、说明

最大序列和为950,序列为[400,400,150]。

五、解题思路

  1. 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和;
  2. 将当前文件大小加到curr上;
  3. 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位;
  4. 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件;
  5. 输出能转储的最大连续文件大小之和ret;

六、Python算法源码

# 导入必要的库
import sys

def main():
    # 读取标准输入的所有行,并去除末尾的换行符
    lines = sys.stdin.read().splitlines()
    
    # 第1行:SATA盘容量M,转换为整数
    M = int(lines[0])
    
    # 第2行:区块链文件大小序列,转换为整数列表
    arr = list(map(int, lines[1].split()))
    
    # 序列arr的长度n
    n = len(arr)
    
    # 连续文件的左边界l,初始为0
    l = 0
    # 连续文件的右边界r,初始为0
    r = 0
    # 当前连续文件大小之和curr,初始为0
    curr = 0
    # 能转储的最大连续文件大小之和ret,初始为0
    ret = 0
    
    # 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while r < n:
        # 将当前文件大小加到curr上
        curr += arr[r]
        
        # 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if curr <= M:
            ret = max(ret, curr)
            r += 1
        else:
            # 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            # 将左指针l指向的文件大小从curr中减去
            curr -= arr[l]
            # 左指针l向右移动一位
            l += 1
    
    # 输出能转储的最大连续文件大小之和ret
    print(ret)

# 调用主函数
if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 定义资源分配函数
function main() {
    const fs = require('fs');
    // 读取所有输入内容,并按行分割
    const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
    
    // 第1行:SATA盘容量M,转换为整数
    const M = parseInt(input[0]);
    
    // 第2行:区块链文件大小序列,转换为整数数组
    const arr = input[1].split(' ').map(Number);
    
    // 序列arr的长度n
    const n = arr.length;
    
    // 连续文件的左边界l,初始为0
    let l = 0;
    // 连续文件的右边界r,初始为0
    let r = 0;
    // 当前连续文件大小之和curr,初始为0
    let curr = 0;
    // 能转储的最大连续文件大小之和ret,初始为0
    let ret = 0;
    
    // 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while (r < n) {
        // 将当前文件大小加到curr上
        curr += arr[r];
        
        // 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if (curr <= M) {
            ret = Math.max(ret, curr);
            r += 1;
        } else {
            // 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            // 将左指针l指向的文件大小从curr中减去
            curr -= arr[l];
            // 左指针l向右移动一位
            l += 1;
        }
    }
    
    // 输出能转储的最大连续文件大小之和ret
    console.log(ret);
}

// 调用主函数
main();

八、C算法源码

#include <stdio.h>

// 主函数
int main() {
    int M; // 定义SATA盘容量M
    // 读取SATA盘容量M
    scanf("%d", &M);
    
    // 定义文件大小数组,最大可能为100000个文件
    int arr[100000];
    int n = 0; // 文件数量初始化为0
    
    // 读取区块链文件大小序列,直到换行或文件结束
    while (scanf("%d", &arr[n]) != EOF) {
        n++;
        // 防止数组越界
        if (n >= 100000) {
            break;
        }
    }
    
    int l = 0; // 连续文件的左边界l,初始为0
    int r = 0; // 连续文件的右边界r,初始为0
    long long curr = 0; // 当前连续文件大小之和curr,使用long long防止溢出
    long long ret = 0; // 能转储的最大连续文件大小之和ret,使用long long
    
    // 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while (r < n) {
        // 将当前文件大小加到curr上
        curr += arr[r];
        
        // 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if (curr <= M) {
            if (curr > ret) {
                ret = curr;
            }
            r++;
        } else {
            // 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            // 将左指针l指向的文件大小从curr中减去
            curr -= arr[l];
            // 左指针l向右移动一位
            l++;
        }
    }
    
    // 输出能转储的最大连续文件大小之和ret
    printf("%lld\n", ret);
    
    return 0; // 程序结束
}

九、C++算法源码

#include <iostream>
#include <vector>
using namespace std;

// 主函数
int main(){
    ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率
    cin.tie(0); // 取消cin和cout的绑定
    
    long long M; // 定义SATA盘容量M,使用long long防止溢出
    cin >> M; // 读取SATA盘容量M
    
    vector<int> arr; // 定义文件大小数组
    int num;
    // 读取区块链文件大小序列,直到换行或文件结束
    while(cin >> num){
        arr.push_back(num);
    }
    
    int n = arr.size(); // 文件数量
    int l = 0; // 连续文件的左边界l,初始为0
    int r = 0; // 连续文件的右边界r,初始为0
    long long curr = 0; // 当前连续文件大小之和curr
    long long ret = 0; // 能转储的最大连续文件大小之和ret
    
    // 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while (r < n) {
        // 将当前文件大小加到curr上
        curr += arr[r];
        
        // 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if (curr <= M) {
            if (curr > ret) {
                ret = curr;
            }
            r++;
        } else {
            // 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            // 将左指针l指向的文件大小从curr中减去
            curr -= arr[l];
            // 左指针l向右移动一位
            l++;
        }
    }
    
    // 输出能转储的最大连续文件大小之和ret
    cout << ret << "\n";
    
    return 0; // 程序结束
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

在这里插入图片描述

【限时免费】20天拿下华为OD笔试之【不定滑窗】2023Q1A-区块链文件转储系统-200分【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解 20天拿下华为OD笔试之【不定滑窗】2023Q1A-区块链文件转储系统-200分【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解 阅读详情

相关推荐

华为OD机试 - 最大连续文件之和(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 1466

华为OD机考算法题:区块链文件转储系统

华为OD机试题目《区块链文件转储系统》的题目解读、最优解的思路分析和代码实现(包括Java和JavaScript)。此题难度为难,时间复杂度为O(n),空间复杂度为 O(1)。

星光灿烂 3211

【华为OD机试真题 Python语言】344、计算最接近的数 | 机试真题+思路参考+代码解析(本题100%)

>给定一个数组X和正整数K,请找出使表达式X[i]-x[i +1]...-.X[i+K 1],结果最接近于数组中位数Q的下标i,如果有多个i满足条件,请返回最大的i 其中,数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值

KJ.JK 2392

区块链文件转储系统【C语言】

滑动窗口

qq_45345724的博客 420

2026华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Python实现。

MISAYAONE的博客 28万+

2026华为OD机试(JAVA&Go)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Java实现。

MISAYAONE的博客 34万+

华为OD机试|华为od题库|华为od机考|2025真题目录C++实现|2025C卷B卷

华为OD机试|华为od题库|华为od机考|2025真题目录C++实现|B卷C卷|华为OD机试|华为od题库|华为od机考|2025真题目录C++实现|B卷C卷|华为OD机试|华为od题库|华为od机考|2025真题目录C++实现|B卷C卷|华为OD机试|华为od题库|华为od机考|2025真题目录C++实现|B卷C卷

u014481728的博客 7万+

2026华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C++实现。

MISAYAONE的博客 20万+

2025华为OD机试真题(C++语言) 真题目录介绍,机试真题 B+C+D+E卷(530道)

本文是2023华为OD机试真题(C++语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 11万+

2026华为OD机试(JavaScript)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,JavaScript实现。

MISAYAONE的博客 8万+

2026华为OD机试(C语言)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C语言实现。

MISAYAONE的博客 11万+

2024华为OD机试D卷 - 小朋友分组最少调整,包含多种语

本人双非民办本科,现在大三下,无实习过,刚找到一个外企实习,但得实习一年而且无转正,值不值得去,去了。#我的简历长这样# #开发岗位# #Java# 投了很多实习,一个面试也没有,到底是哪里出问题了。求助大佬刚实习不久,看项目代码,如何快速学习大型项目代码,并聚焦看懂自己负责的模块,并进行添加功能?#软件开发薪资爆料# 看背景以为是什么财大气粗的好公司,实则里面是技术也没有,马内也没有,唯一好处朝。一年一度的秋招即将开始,每一个经历过秋招的同学都会有自己的酸甜苦辣,去年秋招的同学们,有什么告诫今年。

2301_78234743的博客 1289

华为OD机试 新系统 双机位C卷 往年真题 机考题库(持续收录中)以及算法考点详解(Python/JS/C/C++)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释发现新题目,随时更新。

学Java,找哪吒 5万+

华为OD机试-2024年C卷&D卷真题汇总(Java/Python/C++)

华为OD机试-2024年C卷&D卷真题汇总(Java/Python/C++)华为OD机试-2024年C卷&D卷真题汇总(Java/Python/C++)华为OD机试-2024年C卷&D卷真题汇总(Java/Python/C++)华为OD机试-2024年C卷&D卷真题汇总(Java/Python/C++)华为OD机试-2024年C卷&D卷真题汇总(Java/Python/C++)华为OD机试-2024年C卷&D卷真题汇总(Java/Python/C++)

shen198899的博客 9万+

【2024年华为OD机试】 (A卷,200分)- 区块链文件转储系统(Java & JS & Python&C/C++)

本题的核心是通过滑动窗口技术,动态调整窗口范围,找到满足条件的最大连续文件大小之和。滑动窗口的左指针和右指针分别表示窗口的起始和结束位置,通过移动指针来维护窗口内的文件大小之和。这种方法的时间复杂度为O(n),能够高效地解决问题。这段代码通过滑动窗口算法高效地解决了问题。代码逻辑清晰,注释详细,适合学习和参考。希望这段详细注释和解释对你有帮助!如果有其他问题,欢迎继续讨论。这段代码通过滑动窗口算法高效地解决了问题。代码逻辑清晰,注释详细,适合学习和参考。希望这段详细注释和解释对你有帮助!

嵌入式技术开发 651

【华为OD机试真题】区块链文件转储系统(java&python)100%通过率 超详细代码注释 代码解读

已支持(java&python)原题描述 100%通过率 超详细代码注释 代码解读

笑着的程序员的博客 1362

2025华为OD机试最新题库-(2025A卷+E卷+D卷)-(JAVA、Python、C++)

2024年8月-2025年2月,OD统一考试考的都是(E卷),题库已为大家准备好,命中率95%以上。

goldarmour的博客 9234

华为OD机试 - 区块链文件转储系统( Python)

区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2,…云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。第二行为区块链文件大小序列F1,F2,…其中 1 ≤ n ≤ 100000,1 ≤ Fi ≤ 500。假设每块SATA盘容量为M,求能转储的最大连续文件之和。最大序列和为1000,序列为[100,500,400]最大序列和为950,序列为[400,400,150]

m0_46181452的博客 440
上一篇: 华为OD机试 - 采用合理的缓存策略,最少需要的金币数(Python/JS/C/C++ 2024 E卷 100分)
下一篇: 华为OD机试 - 芯片资源占用(Python/JS/C/C++ 2024 E卷 200分)
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值