华为OD机试真题——简易内存池(2025A卷:200分)Java/python/JavaScript/C++/C/GO最佳实现

article/2025/8/3 1:51:46

在这里插入图片描述

2025 A卷 200分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》

华为OD机试真题《简易内存池》:


目录

    • 题目名称:简易内存池
      • 题目描述
    • Java
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • python
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • JavaScript
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • C++
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • C语言
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析
    • GO
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
        • 示例1输入:
        • 示例2输入:
        • 示例3输入:
      • 综合分析


题目名称:简易内存池


  • 知识点:内存管理(首次适应算法)、逻辑处理
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

请实现一个简易内存池,根据请求命令完成内存分配和释放。
内存池支持两种操作命令:REQUESTRELEASE,其格式为:

  1. REQUEST=请求的内存大小:请求分配指定大小的连续内存。
    • 若分配成功,返回分配到的内存首地址;
    • 若内存不足或请求大小为0,输出 error
  2. RELEASE=释放的内存首地址:释放指定首地址的内存块。
    • 释放成功无需输出;
    • 若释放不存在的首地址,输出 error

约束条件

  1. 内存池总大小为 100字节,地址从0开始分配。
  2. 分配必须为连续内存,优先从低地址分配。
  3. 释放后的内存可被再次分配,但已释放的内存块不可二次释放。
  4. 不会释放已分配内存块的中间地址,仅能通过首地址操作。

输入描述

  • 首行为整数 N(操作命令数,0 < N ≤ 100)。
  • 后续 N 行,每行一个操作命令,格式为 命令=参数(如 REQUEST=10)。

输出描述

  • 按顺序输出每个 REQUEST 的分配结果或 errorRELEASE 仅需在失败时输出 error

示例
输入:

5  
REQUEST=10  
REQUEST=20  
RELEASE=0  
REQUEST=20  
REQUEST=10  

输出:

0  
10  
30  
0  

说明

  1. 第一条 REQUEST=10 分配地址0~9,返回首地址0。
  2. 第二条 REQUEST=20 分配地址10~29,返回首地址10。
  3. RELEASE=0 释放首地址0的内存块,0~9变为空闲。
  4. 第三条 REQUEST=20 因0~9空间不足,从30开始分配,返回首地址30。
  5. 第四条 REQUEST=10 重新分配0~9,返回首地址0。

补充说明

  • 输入保证合法,无需处理非法参数(如负数)。
  • 同一列表元素顺序不可变,动态规划或回溯法为典型解法。

Java

问题分析

我们需要实现一个简易内存池,支持 REQUESTRELEASE 命令。内存池总大小为 100 字节,地址从 0 开始。分配时采用首次适应算法,优先低地址分配连续内存。释放时需处理合并相邻空闲块。


解题思路

  1. 数据结构设计

    • 空闲块列表:按起始地址升序排列,记录每个空闲块的起始地址和大小。
    • 已分配块字典:记录已分配块的首地址和大小,用于快速查找。
  2. REQUEST 处理

    • 遍历空闲块列表,找到第一个足够大的块。
    • 分割该块,记录已分配块,更新空闲列表。
  3. RELEASE 处理

    • 检查要释放的块是否存在。
    • 将释放的块插入空闲列表并合并相邻块。

代码实现

import java.util.*;class Block {int start;int size;public Block(int s, int sz) {start = s;size = sz;}
}public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = Integer.parseInt(scanner.nextLine());List<Block> freeList = new ArrayList<>();freeList.add(new Block(0, 100)); // 初始空闲块:0-99Map<Integer, Integer> allocated = new HashMap<>();for (int i = 0; i < N; i++) {String line = scanner.nextLine();String[] parts = line.split("=");String cmd = parts[0];int param = Integer.parseInt(parts[1]);if (cmd.equals("REQUEST")) {// REQUEST 处理int size = param;if (size <= 0) {System.out.println("error");continue;}boolean found = false;for (int j = 0; j < freeList.size(); j++) {Block block = freeList.get(j);if (block.size >= size) {// 分配该块allocated.put(block.start, size);System.out.println(block.start);// 处理剩余空间int remaining = block.size - size;if (remaining > 0) {freeList.set(j, new Block(block.start + size, remaining));} else {freeList.remove(j);}found = true;break;}}if (!found) {System.out.println("error");}} else if (cmd.equals("RELEASE")) {// RELEASE 处理int addr = param;if (!allocated.containsKey(addr)) {System.out.println("error");continue;}int size = allocated.get(addr);Block newBlock = new Block(addr, size);// 插入到正确位置int insertIdx = 0;while (insertIdx < freeList.size() && freeList.get(insertIdx).start < newBlock.start) {insertIdx++;}freeList.add(insertIdx, newBlock);// 合并左边while (insertIdx > 0) {Block prev = freeList.get(insertIdx - 1);if (prev.start + prev.size == newBlock.start) {newBlock.start = prev.start;newBlock.size += prev.size;freeList.remove(insertIdx - 1);insertIdx--;} else {break;}}// 合并右边while (insertIdx < freeList.size() - 1) {Block next = freeList.get(insertIdx + 1);if (newBlock.start + newBlock.size == next.start) {newBlock.size += next.size;freeList.remove(insertIdx + 1);} else {break;}}allocated.remove(addr);}}}
}

代码详细解析

  1. Block 类:表示内存块,包含起始地址 start 和大小 size
  2. 初始化
    • freeList 初始为 0-99 的块。
    • allocated 记录已分配块的首地址和大小。
  3. REQUEST 处理
    • 遍历 freeList 找第一个足够大的块。
    • 分配后分割剩余空间,更新 freeListallocated
  4. RELEASE 处理
    • 检查地址是否存在,不存在则输出错误。
    • 插入释放的块到 freeList,合并相邻块。

示例测试

示例1输入:
5  
REQUEST=10  
REQUEST=20  
RELEASE=0  
REQUEST=20  
REQUEST=10  

输出

0  
10  
30  
0  

解析

  • 前两次分配分别获得 0-9 和 10-29。
  • 释放 0-9 后,第三次分配 30-49。
  • 第四次分配重新使用 0-9。
示例2输入:
3  
REQUEST=50  
RELEASE=0  
REQUEST=50  

输出

0  
error  
0  

解析

  • 首次分配 0-49,释放后合并为 0-99。
  • 再次分配成功。
示例3输入:
4  
REQUEST=100  
RELEASE=0  
REQUEST=99  
REQUEST=1  

输出

0  
99  
error  

解析

  • 首次分配全部内存,释放后再次分配 99 字节成功,剩余 1 字节不足以分配。

综合分析

  1. 时间复杂度:O(N^2)

    • 每个 REQUESTRELEASE 最坏需遍历列表,但 N ≤ 100,实际可行。
  2. 空间复杂度:O(N)

    • 空闲块和已分配块的数量与操作数相关,但总量较小。
  3. 优势

    • 首次适应算法:简单高效,优先低地址分配。
    • 合并策略:释放时合并相邻块,减少内存碎片。
  4. 适用场景

    • 适用于操作数较少且内存管理简单的场景。

python

问题分析

我们需要实现一个简易内存池,支持 REQUESTRELEASE 操作。内存池总大小为 100 字节,地址从 0 开始分配。分配时采用首次适应算法,优先从低地址分配连续内存。释放后需合并相邻空闲块。


解题思路

  1. 数据结构设计

    • 空闲块列表:按起始地址升序排列,每个块记录起始地址和大小。
    • 已分配块字典:记录已分配块的首地址和大小,便于快速查找。
  2. REQUEST 处理

    • 遍历空闲块列表,找到第一个足够大的块。
    • 分割该块,记录已分配块,更新空闲列表。
  3. RELEASE 处理

    • 检查要释放的块是否存在。
    • 将释放的块插入空闲列表并合并相邻块。

代码实现

import bisectn = int(input())
free_blocks = [(0, 100)]  # 空闲块列表,按起始地址排序
allocated = {}             # 已分配块字典 {起始地址: 大小}for _ in range(n):line = input().strip()cmd, param = line.split('=')param = int(param)if cmd == 'REQUEST':size = paramif size <= 0:print('error')continuefound = 

http://www.hkcw.cn/article/FtmlDluoMc.shtml

相关文章

mysql-mysql源码本地调试

前言 先进行mysql源码本地编译&#xff1a;mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …

华为OD机试真题——查找接口成功率最优时间段(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

硬件I2C和软件I2C的区别

硬件I2C和软件I2C的区别 一、硬件I2C 1、硬件IC的局限性及学习意义 尽管硬件IC外设在STM32等微控制器中提供了标准化的通信支持&#xff0c;但在实际应用中&#xff0c;其稳定性可能存在问题。例如&#xff0c;某些情况下外设会因事件检测异常而进入死锁状态&#xff0c;仅能…

PyCharm接入DeepSeek,实现高效AI编程

介绍本土AI工具DeepSeek如何结合PyCharm同样实现该功能。 一 DeepSeek API申请 首先进入DeepSeek官网&#xff1a;DeepSeek 官网 接着点击右上角的 “API 开放平台“ 然后点击API keys 创建好的API key&#xff0c;记得复制保存好 二 pycharm 接入deepseek 首先打开PyCh…

大模型-attention汇总解析之-MQA

MQA&#xff0c;即 “Multi-Query Attention”&#xff0c;是减少 KV Cache 的一次的一种大胆尝试&#xff0c;首次提出自《Fast Transformer Decoding: One Write-Head is All You Need》&#xff0c; 在2019 年减少 KV Cache 就已经是研究人员非常关注的一个课题了。MQA 的思…

华为OD机试真题——游戏分组王者荣耀(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

主流 AI IDE 之一的 Windsurf 使用入门

一、Windsurf 的常见入门界面 以上是本次展示Windsurf版本信息。 1.1 个人配置中心 1.2 AI 助手快捷设置 1.3 使用额度查看页面 1.4 智能助手 Windsurf 编辑器中 AI 助手名称 &#xff1a;Cascade 。打开 Cascade 窗口&#xff0c;开始聊天就可以了。方框里有写和聊两种状态锁…

大数据量下的数据修复与回写Spark on Hive 的大数据量主键冲突排查:COUNT(DISTINCT) 的陷阱

背景与问题概述 这一周&#xff08;2025-05-26-2026-05-30&#xff09;我在搞数据拟合修复优化的任务&#xff0c;有大量的数据需要进行数据处理及回写&#xff0c;大概一个表一天一分区有五六千万数据&#xff0c;大约一百多列的字段。 具体是这样的我先取档案&#x…

长尾关键词优化驱动SEO增长

内容概要 在搜索引擎优化领域&#xff0c;长尾关键词的精细化运营已成为突破流量瓶颈的核心突破口。相较于通用型关键词&#xff0c;长尾词凭借其低竞争度、高转化潜力的特性&#xff0c;能够精准捕捉用户搜索意图&#xff0c;为网站带来更具价值的自然流量。本文将从战略定位…

数字孪生驱动的智慧水务管网智能运维系统实践

引言&#xff1a;数字孪生赋能城市水务基础设施智能化转型 在新型智慧城市架构中&#xff0c;地下供水管网作为城市生命线工程&#xff0c;其数字化重构已成为市政基础设施现代化的核心命题。本文以某省会城市智慧水务示范项目为蓝本&#xff0c;系统阐述数字孪生技术在供水管…

数据资产——立法与实操指南

5月27日&#xff0c;数据资产一千零一夜&#xff0c;华东数交周二夜谈第三十三期圆满结束&#xff0c;上海国瓴律师事务所首席合伙人、管理委员会主席高慧、天册(上海)律师事务所律师邓亚军&#xff1b;数据宝网络科技有限公司数据资产研究院高级研究员王国辉共同围绕“数据资产…

放假带出门的充电宝买哪种好用耐用?倍思超能充35W了解一下!

端午节的到来和毕业季的临近&#xff0c;让很多人开始计划出游或长途旅行。而在旅途中&#xff0c;一款好用耐用的充电宝可以省不少事。今天&#xff0c;我们就来聊聊放假带出门的充电宝买哪种好用耐用&#xff0c;看看为什么倍思超能充35W更适合带出门~ 一、为什么需要一款好用…

ONLYOFFICE文档API:更强的安全功能

在数字化办公时代&#xff0c;文档的安全性与隐私保护已成为企业和个人用户的核心关切。如何确保信息在存储、传输及协作过程中的安全&#xff0c;是开发者与IT管理者亟需解决的问题。ONLYOFFICE作为一款功能强大的开源办公套件&#xff0c;不仅提供了高效的文档编辑与协作体验…

day14 leetcode-hot100-27(链表6)

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 1. 暴力法 思路 创建一个空节点&#xff0c;用来组装这两个链表&#xff0c;谁小谁就是下一个节点。 知识 创建空节点&#xff1a;ListNode n1 new ListNode(-1); 具体代码 /*** Definition for singly-l…

DALI DT6与DALI DT8介绍

“DT”全称Device Type&#xff0c;是DALI-2 标准协议中的IEC 62386-102(即为Part 102)部分对不同类型的控制设备进行一个区分。不同的Device Type代表不同特性的控制设备&#xff0c;也代表了这种控制设备拥有的扩展的特性。 在DALI&#xff08;数字可寻址照明接口&#xff09…

【自然语言处理】——基于与训练模型的方法【复习篇1】

本系列文章主要通过课本课后题目的方式来进行期末复习&#xff0c;很多知识分析的可能会比较浅&#xff0c;所以还请大佬们及时指正&#xff0c;我们可以在评论区讨论交流&#xff01; 2.1 基于规则与基于机器学习的自然语言处理方法分别有哪些优缺点&#xff1f; 【先总结来讲…

Golang——2、基本数据类型和运算符

基本数据类型和运算符 1、基本数据类型1.1、整形1.2、浮点型1.3、布尔值1.4、字符串1.5、byte和rune类型1.6、修改字符串 2、基本数据类型之间的转换2.1、数值类型之间的相互转换2.2、其他类型转换成string类型2.3、string类型转换成数值类型 3、Golang中的运算符3.1、算数运算…

服务器如何配置防火墙管理端口访问?

配置服务器防火墙来管理端口访问&#xff0c;是保障云服务器安全的核心步骤。下面我将根据你使用的不同操作系统&#xff08;Linux: Ubuntu/Debian/CentOS&#xff1b;Windows Server&#xff09;介绍常用防火墙配置方法。 ✅ 一、Linux 防火墙配置&#xff08;UFW / firewalld…

4.2.2 Spark SQL 默认数据源

在本实战概述中&#xff0c;我们探讨了如何在 Spark SQL 中使用 Parquet 格式作为默认数据源。首先&#xff0c;我们了解了 Parquet 文件的存储特性&#xff0c;包括其二进制存储方式和内嵌的 Schema 信息。接着&#xff0c;通过一系列命令&#xff0c;我们演示了如何在 HDFS 上…

4.0/Q2,GBD数据库最新文章解读

文章题目&#xff1a;Global burden of Type 2 Diabetes Mellitus attributable to dietary risks in elderly adults: insights from the Global Burden of Disease study 2021 DOI&#xff1a;10.3389/fnut.2025.1557923 中文标题&#xff1a;老年人饮食风险导致的 2 型糖尿病…