华为OD机试 - 简易内存池 - 逻辑分析(Java 新系统 200分)

AI摘要

本文详解华为OD机试中‘简易内存池’题目,要求基于100字节固定大小内存池,支持REQUEST(按需连续分配,首次适配)和RELEASE(按首地址释放)操作。核心在于维护已分配区间映射关系,动态计算空闲段并保证地址连续性和低址优先分配策略。重点涉及内存碎片处理、边界校验及最后有效请求地址输出逻辑。

在这里插入图片描述

华为OD机试 新系统 题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题》。

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

一、题目描述

请实现一个简易内存池,根据请求命令完成内存分配和释放。

内存池支持两种操作命令,REQUEST和RELEASE,其格式为:

1、REQUEST

请求的内存大小表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输出error。

2、RELEASE

释放的内存首地址 表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。

注意:

1.内存池总大小为100字节。
2.内存池地址分配必须是连续内存,并优先从低地址分配。
3.内存释放后可被再次分配,已释放的内存在空闲时不能被二次释放。
4.不会释放已申请的内存块的中间地址。
5.释放操作只是针对首地址所对应的单个内存块进行操作,不会影响其它内存块。

二、输入描述

首行为整数N,表示操作命令的个数。

接下来的N行,每行将给出一个操作命令,操作命令和参数之间用“=”分割

三、输出描述

输出最后请求的内存的首地址。

如果位置已满,则输出-1。

样例:

2
REQUEST=10
REQUEST=20

输出样例:

0
10

四、解题思路

  1. 定义一个map,存储内存的分配情况(key:内存的首地址,value:内存的尾地址);
  2. 请求内存时
    • 如果map是空,放在首地址0处;
    • 如果map不为空,遍历已经存入的首地址;
      • 已经存入的首地址 - 第一个空闲区域的首地址 大于 请求的内存值;
      • 将当前请求的内存的首地址和内存的尾地址存入map;
      • 反之,重置前一个空闲区域的首地址;
    • 判断剩余内存是否可以容下当前请求值;
      • 如果可以容下,将当前请求的内存的首地址和内存的尾地址存入map;
      • 如果容不下,输出error;
  3. 释放内存时,将其首地址的key移除map;
  4. 最后输出最后一次请求的首地址。

注意:如果最后发起的命令是RELEASE,也是可以的,会返回最后一次REQUEST的首地址。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest03 {

    static final String REQUEST = "REQUEST";
    static final String RELEASE = "RELEASE";
    static final String ERROR = "error";
    static final int MAX = 100;

    public static void main(String[] args) {
        try {
            Scanner sc = new Scanner(System.in);
            // 操作命令的个数
            int N = Integer.parseInt(sc.nextLine());
            // 每一行的操作命令和参数
            String[][] lineArr = new String[N][2];
            // 接下来的N行,每行将给出一个操作命令,操作命令和参数之间用“=”分割
            for (int i = 0; i < N; i++) {
                lineArr[i] = sc.nextLine().split("=");
            }

            for (int i = 0; i < N; i++) {
                // 内存大小
                int value = Integer.parseInt(lineArr[i][1]);
                if (lineArr[i][0].startsWith(REQUEST)) {// 请求
                    // 非法输入(内存池总大小为100字节)
                    if (value > MAX || value <= 0) {
                        System.out.println(ERROR);
                        return;
                    }
                    request(value);
                } else if (lineArr[i][0].startsWith(RELEASE)) {// 释放
                    map.remove(value);
                } else {// 非法输入
                    System.out.println(ERROR);
                }
            }
        } catch (Exception e) {
            // 非法输入
            System.out.println(ERROR);
        }
    }

    /**
     * 存储内存的分配情况
     * key:内存的首地址
     * value:内存的尾地址
     */
    static Map<Integer, Integer> map = new TreeMap<>();

    /**
     * 请求内存
     * @value:大小
     */
    public static void request(int value) {
        int zero = 0;
        // 前一个空闲区域的首地址
        int beforeHeadAddress = 0;

        // 如果map是空,放在首地址0处
        if (map.isEmpty()) {
            map.put(zero, value);
        } else {
            // 已经存入的首地址
            List<Integer> headList = new ArrayList<>(map.keySet());
            // 已经存入的首地址
            for (Integer requestedHead : headList) {
                // 已经存入的首地址 - 第一个空闲区域的首地址 大于 请求的内存值
                if (requestedHead - beforeHeadAddress >= value) {
                    /**
                     * beforeHeadAddress:内存的首地址
                     * beforeHeadAddress + value:内存的尾地址
                     */
                    map.put(beforeHeadAddress, beforeHeadAddress + value);
                } else {
                    // 前一个空闲区域的首地址
                    beforeHeadAddress = map.get(requestedHead);
                }
            }
            // 判断剩余内存是否可以容下当前请求值
            if (MAX - beforeHeadAddress >= value) {
                map.put(beforeHeadAddress, beforeHeadAddress + value);
                System.out.println(beforeHeadAddress);
            } else {
                // 如果位置已满,则输出-1。
                System.out.println("-1");
            }
        }
    }
}

六、效果展示

1、输入

4
REQUEST=20
REQUEST=30
RELEASE=0
REQUEST=30

2、输出

50

3、说明

  • 第一次请求20
  • 第二请求30
  • 第三次释放首地址为0的内存
  • 第四次请求30,第一个空闲区域的首地址是0,但空闲长度只有20,放不下当前请求的地址,因此消耗剩余内存,输出最后一次请求的首地址为50。

在这里插入图片描述

4、再输入

6
REQUEST=20
REQUEST=30
RELEASE=0
REQUEST=30
REQUEST=10
REQUEST=10

5、再说明

  • 第一次请求20
  • 第二请求30
  • 第三次释放首地址为0的内存
  • 第四次请求30,第一个空闲区域的首地址是0,但空闲长度只有20,放不下当前请求的地址,因此消耗剩余内存。
  • 第五次请求10,第一个空闲区域的首地址是0,长度20,可以容下当前请求的内存10。
  • 第六次请求10,第一个空闲区域的首地址是10,长度10,可以容下当前请求的内存10。
  • 输出最后一次请求的首地址为10。

在这里插入图片描述

在这里插入图片描述

6、如果走后一次请求的是20,会怎么样呢?

在这里插入图片描述


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 新系统 100分)

🏆本专栏收录于《华为OD机试(JAVA)真题》。

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

在这里插入图片描述

华为OD机试【简易内存池】(java)(200分) 请实现一个简易内存池,根据请求命令完成内存分配和释放。 内存池支持两种操作命令,REQUEST和RELEASE,其格式为: REQUEST=请求的内存大小 表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输出error。 RELEASE=释放的内存首地址 表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。 阅读详情

相关推荐

【华为OD机试真题 C++】简易内存池

请实现一个简易内存池,根据请求命令完成内存分配和释放。内存池支持两种操作命令,REQUEST和RELEASE,其格式为:REQUEST=请求的内存大小,表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输error。 RELEASE=释放的内存首地址,表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。

A_D_I_D_A_S的博客 615

【华为OD机试】简易内存池(python, java, c++, js)

请实现一个简易内存池,根据请求命令完成内存分配和释放。内存池支持两种操作命令,REQUEST和RELEASE,其格式为:REQUEST=请求的内存大小,表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输error。 RELEASE=释放的内存首地址,表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。

A_D_I_D_A_S的博客 440

华为OD机试 - 简易内存池(Python)

当REQUEST申请size大小的内存时,我们从start=0位置开始申请,即申请[start, start+size-1]区间,接下来看该区间是否和used[i]区间存在交叉,如果存在交xian叉,则说明申请的内存区间中部分内存已被使用,因此我们应该更新 start = used[i][1] + 1位置,重新申请一个区间,这样就必然不和used[i]区间交叉了,但是要继续和used[i+1]区间比较。第三条指令,释放首地址为0的内存申请,0~9地址内存被释放,变为空闲,释放成功,无需输出。

m0_46181452的博客 429

2026年华为od机试真题题库

OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)

面试高手的博客 19万+

华为OD机试 新系统 双机位C卷 真题题库目录|机考题库 + 算法考点详解

本文整理华为OD机试(机考) 新系统真题题库,提供高频考点精析与详细题目内容,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解 和 在线OJ做题练习。华为OD机试新系统真题题库。

qq_45776114的博客 10万+

【华为OD机考真题】- 简易内存池2(2025B卷-200分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可

**My Coding Family** 1039

华为OD机试 - 简易内存池(Python/JS/C/C++ 新系统 200分)

每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3229

【华为OD机考真题】- 简易内存池(2025B卷-200分)(Python版)

🔔本文收录于「最新最全华为OD机试真题(Python版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1701

【2025华为OD机考真题】- 简易内存池(B卷-200分)(JS版)

🔔本文收录于「最新最全华为OD机试真题(JavaScript版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,

**My Coding Family** 1290

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

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

MISAYAONE的博客 28万+

简易的内存池实现

简单的内存池实现,已经应用到一个小项目中,使用方法看头文件吧,代码也不多.

安卓app逆向破解脱壳教程

From:Hook 神器家族的 Frida 工具使用详解:https://blog.youkuaiyun.com/FlyPigYe/article/details/90258758 详解 Hook 框架 frida (信抢红包):https://www.freebuf.com/company-information/180480.html APP逆向神器之Frida【Android初级篇】:https://www.jianshu.com/p/2d755beb1c54 frida 官网文档:https://fr..

sinat_28371057的博客 2万+

半导体制造技术导论(第二版)萧宏 第五章集成电路加热工艺答案

第二次退火是在较高温度下进行,并将电阻系数较高的c49碳化硅转变为电阻系数较低的c54碳。水平式高温炉加热、垂直式高温炉加热(即传统的管式炉加热)、快速加热工艺RTP、激光镭射。8. 集成电路芯片制造过程中,会使用垫底氧化层、阻挡氧化层、栅氧氧化层、屏蔽氧化层和全。氧化是最重要的加热过程之一,是一种添加工艺,将氧气加入到硅晶圆后,在晶圆表面形成二氧。为了满足元器件性能的要求,必须利用退火工艺将晶格的损伤修复,使其恢复单晶结构并激活掺。工艺氮气气流下将晶舟推入炉管,升高温度,稳定温度;

goal_achieving的博客 1863

百度文心大模型ERNIE全面解析

文章摘要:本文汇总了多个Python自然语言处理(NLP)工具库的应用实例,涵盖百度文心大模型ERNIE、Hugging Face Transformers、StanfordNLP、SymSpell等主流框架。内容涉及文本预处理、情感分析、命名实体识别、机器翻译、文本纠错等典型NLP任务,并包含ERNIE-Lite、BART、T5等模型的调用示例。各工具库的特色功能包括:ERNIE的知识增强技术、Transformers的多任务统一接口、SymSpell的高效拼写纠正等。文章还提供了知识图谱构建、Rasa对

keny-大成的博客 2523

FreeRTOS实战:STM32CubeMX配置USART+DMA实现高效串口通信(附完整代码)

本文详细介绍了如何使用FreeRTOS和STM32CubeMX配置USART与DMA实现高效串口通信。通过对比轮询、中断和DMA三种模式的性能差异,提供完整的STM32CubeMX配置步骤和代码实现,帮助开发者优化嵌入式系统的串口通信性能,显著提升数据吞吐量和系统响应速度。

weixin_29190169的博客 454

从扇束到平行束:等角重排算法在CT重建中的核心原理与MATLAB实践

本文深入解析了CT图像重建中等角扇束重排算法的核心原理与MATLAB实现。通过将实际采集的扇束投影数据,利用几何映射和两次关键插值,转换为适用于经典滤波反投影算法的平行束数据,打通了高效重建的关键路径。文章结合Shepp-Logan模型仿真,提供了完整的MATLAB代码实践,并分析了源-物距、采样率等关键参数对重建质量的影响。

cnn8visionary的博客 645

redhawk-sc(seascape)学习日志2

design view是主view,是所有seascape view中最root的部分,一个design view可以驱动多种类型分析比如静态IR drop,动态IR drop以及EM.这些分析可以在不同的PVT和翻转率下.Design view是一个必须的view对于redhawk中的任何类型分析来说。seascape view相当于一个容器,用于保存各种和设计相关的数据,类似于逻辑信息、物理信息等等,每个view都有其对应的输入件和依赖,这些view都是redhawk用于各种类型的分析所需。

qq_39493558的博客 3496

星载SAR的各项指标解读(史上最全)

一、系统指标 系统指标主要指雷达系统的通用的指标,以及和卫星整星相关的指标,主要有一下几项: 工作频段: 雷达体制: 极化方式: 设计s

9267

FPGA实现串口升级及MultiBoot(九)BPI FLASH相关实例演示

与SPI相关知识并没有什么太多区别(别杠硬件或者架构上),相关知识点都在上面指出,大家有什么其他需要注意点,欢迎留言讨论。关于“四样错误”就不演示了,没什么太大区别,下一讲我们开始串口升级。PS:为了扩展ICAPE2原语的使用,在原来的基础上增加了几个常用FPGA ID,并在触发启动时候增加了可选电平触发或上升/下降沿触发(例化IP时选择),新版本号V1.1。

OpenFPGA的博客 1439

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 华为OD机试 - 判断字符串子序列 - 倒序遍历(Java 2025 C卷 100分)
下一篇: 华为OD机试 - 城市聚集度(Java 2025 B卷 200分)
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值