简易内存池2 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

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

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

  • REQUEST=请求的内存大小 表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输error。
  • RELEASE=释放的内存首地址 表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。

注意:

1.内存池总大小为100字节

2.内存池地址分配必须是连续内存,并优先从低地址分配

3.内存释放后可被再次分配,已释放的内存在空闲时不能被二次释放。

4.不会释放已电请的内存块的中间地排

5.释放操作只是针对首地址所对应的单个内存块进行操作,不会影响其它内存块。

输入描述

首行为整数N表示操作命令的个数,取值范围: 0 N<100。

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

输出描述

见题面输出要求

示例1

输入:
3
REQUEST=30
RELEASE=0
REQUEST=30输出:
0
0

题解

解题思路

该问题要求实现一个简易内存池,支持两种操作命令:REQUESTRELEASE

  • REQUEST 表示请求分配指定大小内存,

  • RELEASE 表示释放之前分配的内存。

内存池总大小为 100 字节,地址分配必须是连续内存,并优先从低地址分配。

解题思路主要包括以下几个步骤:

  1. 定义内存池的大小、内存使用状态、已分配内存的字典(映射首地址到内存大小)。
  2. 实现 request 方法,用于处理请求分配内存的操作。遍历内存池,找到连续的空闲内存块,并记录已分配的内存块。
  3. 实现 release 方法,用于处理释放内存的操作。在已分配的内存块中查找要释放的地址,将其标记为空闲状态。
  4. main 函数中,根据输入命令调用相应方法,输出结果。

Java

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = Integer.parseInt(in.nextLine());Solution solution = new Solution();for (int i = 0; i < n; i++) {String[] split = in.nextLine().split("=");int val = Integer.parseInt(split[1]);if ("REQUEST".equals(split[0])) {// 申请内存solution.request(val);} else {// 释放内存solution.release(val);}}}
}class Solution {// 声明一个静态字符串变量,用于表示错误信息public static String ERROR = "error";// 内存大小private int size;// 内存使用状态private boolean[] mem;// 已经使用的内存<首地址, 内存大小>private Map<Integer, Integer> used = new HashMap<>();public Solution() {this.size = 100;this.mem = new boolean[size];}// 申请内存public void request(int val) {if (val == 0 || val > 100) {System.out.println(ERROR);return;}for (int i = 0; i < size; i++) {// 当前内存已被使用if (mem[i]) continue;int cnt = 0;  // 空闲的连续内存大小while (i + cnt < size && !mem[i + cnt]) cnt++;// 空间足够分配if (cnt >= val) {// 记录已经申请的内存片段used.put(i, val);// 标记内存点已被使用while (--val >= 0) mem[i + val] = true;System.out.println(i);return;}i += cnt;}System.out.println(ERROR);}// 释放内存public void release(int addr) {if (!used.containsKey(addr)) {  // 不存在的首地址System.out.println(ERROR);return;}// 释放内存片段int s = addr, len = used.get(s);// 标记内存点空闲for (int i = 0; i < len; i++) mem[s + i] = false;used.remove(addr);}
}

Python

class Solution:# 类变量,用于表示错误信息ERROR = "error"def __init__(self):self.size = 100# 内存使用状态self.mem = [False] * self.size# 已经使用的内存 {首地址: 内存大小}self.used = {}# 申请内存def request(self, val):if val == 0 or val > 100:print(self.ERROR)returni = 0while i < self.size:# 当前内存已被使用if self.mem[i]:i += 1continuecnt = 0  # 空闲的连续内存大小while i + cnt < self.size and not self.mem[i + cnt]:cnt += 1# 空间足够分配if cnt >= val:# 记录已经申请的内存片段self.used[i] = val# 标记内存点已被使用for j in range(val):self.mem[i + j] = Trueprint(i)returni += cntprint(self.ERROR)# 释放内存def release(self, addr):if addr not in self.used:  # 不存在的首地址print(self.ERROR)return# 释放内存片段s, length = addr, self.used[addr]# 标记内存点空闲for i in range(length):self.mem[s + i] = Falsedel self.used[addr]def main():n = int(input())solution = Solution()for _ in range(n):relation = input().split("=")val = int(relation[1])if relation[0] == "REQUEST":# 申请内存solution.request(val)else:# 释放内存solution.release(val)if __name__ == "__main__":main()

C++

#include <iostream>
#include <unordered_map>
#include <vector>
#include <sstream>using namespace std;void request(vector<bool>& mem, unordered_map<int, int>& used, int val) {const int size = mem.size();if (val == 0 || val > size) {cout << "error" << endl;return;}for (int i = 0; i < size; ) {if (mem[i]) {++i;continue;}int cnt = 0;  // 空闲的连续内存大小while (i + cnt < size && !mem[i + cnt]) {++cnt;}if (cnt >= val) {used[i] = val;for (int j = 0; j < val; ++j) {mem[i + j] = true;}cout << i << endl;return;}i += cnt;}cout << "error" << endl;
}void release(vector<bool>& mem, unordered_map<int, int>& used, int addr) {if (used.find(addr) == used.end()) {cout << "error" << endl;return;}int len = used[addr];for (int i = 0; i < len; ++i) {mem[addr + i] = false;}used.erase(addr);
}int main() {int n;cin >> n;cin.ignore();  // Consume the newline after nconst int size = 100;// 内存使用状态vector<bool> mem(size, false);// 已经使用的内存<首地址, 内存大小>unordered_map<int, int> used;for (int i = 0; i < n; ++i) {string line;getline(cin, line);int    pos       = line.find('=');string operation = line.substr(0, pos);int    val       = stoi(line.substr(pos + 1));if (operation == "REQUEST") {request(mem, used, val);} else {release(mem, used, val);}}return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 【1】—— 安装 与 配置

Redis 【1】—— 安装 与 配置 一、安装 与 配置&#xff08;一&#xff09;使用 yum 安装&#xff08;二&#xff09;创建符号链接1. 软链接2. 相关指令 &#xff08;三&#xff09;修改配置文件&#xff08;四&#xff09;Redis 的启停 一、安装 与 配置 &#xff08;一&…

外贸业务员没客户的7大原因+解决办法!

业务员没有客户&#xff0c;就是无源之水&#xff0c;无本之木&#xff0c;这自然也就没有业绩。那些吃空饷的业务员&#xff0c;迟早会拖垮公司。所以不管是什么原因导致的业务员没客户&#xff0c;都要一一查验清楚。七个业务员没有客户的原因&#xff0c;七种对策&#xff0…

华为数通方向HCIP-DataCom H12-821题库(多选题:21-40)

第21题 管理员在配置 VRRP 时,下面哪些不是必须配置的? A.抢占模式 B.抢占延时 C.虚拟IP 地址 D.虚拟路由器的优先级 【参考答案】ABD 【答案解析】 VRRP的作用之一是提供一个虚拟的IP地址,用作默认网关,用来实现冗余和故障转移。因此,配置虚拟IP地址是必须的。华为设备vr…

hcip交换

交换机功能 无限的传输距离——识别&#xff0c;重写电信号&#xff08;帧&#xff09;保证信息完整彻底解决了冲突二层单播——MAC地址表提高端口密度 单播地址&#xff1a;MAC地址第一个字节第8位为0 组播地址&#xff1a;MAC地址第一个字节第8位为1 广播地址&#xff1a;全1…

渗透测试靶场环境搭建

1.DVWA靶场 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用&#xff0c;包含了OWASP TOP10的所有攻击漏洞的练习环境&#xff0c;旨在为安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;同时…

Mybatis批量更新对象数据的两种方法

说明&#xff1a;遇到一次需要批量修改对象的场景。传递一个对象集合&#xff0c;需要根据对象ID批量修改数据库数据&#xff0c;使用的是MyBatis框架。查了一些资料&#xff0c;总结出两种实现方式。 创建Demo 首先&#xff0c;创建一个简单的Demo&#xff1b; &#xff08…

SpringBoot+Jwt+Redis

大致流程&#xff1a; 参照&#xff1a; 史上最全面的基于JWT token登陆验证_完整的基于jwt的登陆认证-CSDN博客 springboot整合JWTRedis_springboot jwt redis-CSDN博客

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:浮层)

设置组件的遮罩文本。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 overlay overlay(value: string | CustomBuilder, options?: { align?: Alignment; offset?: { x?: number; y?: number } })…

剑指offer面试题28:对称的二叉树

#试题28&#xff1a;对称的二叉树 题目&#xff1a; 请设计一个函数判断一棵二叉树是否 轴对称 。 示例 1&#xff1a; 输入&#xff1a;root [6,7,7,8,9,9,8] 输出&#xff1a;true 解释&#xff1a;从图中可看出树是轴对称的。示例 2&#xff1a; 输入&#xff1a;root …

【合宙ESP32C3 Arduino开发】第四篇:TFT_eSPI 驱动 合宙Air101 ST7735 LCD 显示普通时钟,模块化编程

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建时间 2024-03-02❤️❤️ 本篇更新时间 2024-03-02❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64f;…

白话大模型② | 如何提升AI分析的准确性?

白话大模型系列共六篇文章&#xff0c;将通俗易懂的解读大模型相关的专业术语。本文为第二篇&#xff1a;如何提升AI分析的准确性&#xff1f; 作者&#xff1a;星环科技 人工智能产品部 面对AI分析落地时的数量化、准确性、泛化性等问题&#xff0c;让我们稍微深入了解下当前…

pycharm专业版本的安装

一 、到官网下载对应的pycharm安装包 也可以把安装软件&#xff08;用物理机下载到共享文件夹&#xff09; 然后进入Ubuntu系统把下载大的安装包剪贴到目标路径 1 在ubuntu中创建一个用来存放pycharm安装包的文件夹 rootzmq-virtual-machine:/home/zmq/Desktop# mkdir pycha…

京东云硬钢阿里云:承诺再低10%

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 阿里云刚刚宣布史上最大规模的全线产品降价20%&#xff0c;这热度还没过&#xff0c;京东云当晚就喊话&#xff1a;“随便降、比到底!&#xff0c;全网比价&#xff0c;击穿低价&#xff0c;再低10%”&#xff0c;并…

[技巧]Arcgis之图斑四至范围批量计算

ArcGIS图层&#xff08;点、线、面三类图形&#xff09;四至范围计算 例外一篇介绍&#xff1a;[技巧]Arcgis之图斑四至点批量计算 说明&#xff1a;如下图画出来的框&#xff08;范围标记不是很准&#xff09; &#xff0c;图斑的x最大和x最小&#xff0c;y最大&#xff0c;…

专为大模型训练优化,百度集合通信库 BCCL 万卡集群快速定位故障

1 集合通信对分布式训练至关重要 在分布式训练中&#xff0c;每一块 GPU 只负责处理部分模型或者数据。集群中不同 GPU 之间通过集合通信的方式&#xff0c;完成梯度同步和参数更新等操作&#xff0c;使得所有 GPU 能够作为一个整体加速模型训练。 如果有一块 GPU 在集合通…

1_SQL

文章目录 前端复习SQL数据库的分类关系型数据库非关系型数据库&#xff08;NoSQL&#xff09; 数据库的构成软件架构MySQL内部数据组织方式 SQL语言登录数据库数据库操作查看库创建库删除库修改库 数据库中表的操作选择数据库创建表删除表查看表修改表 数据库中数据的操作添加数…

性别和年龄的视频实时监测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 性别和年龄检测 Python 项目 首先介绍性别和年龄检测的高级Python项目中使用的专业术语 什么是计算机视觉&#xff1f; 计算机视觉是使计算机能…

基于Camunda实现bpmn 2.0各种类型的任务

基于Camunda实现bpmn中各种类型任务 ​ Camunda Modeler -为流程设置器&#xff08;建模工具&#xff09;&#xff0c;用来构建我们的流程模型。Camunda Modeler流程绘图工具&#xff0c;支持三种协议类型流程文件分别为&#xff1a;BPMN、DMN、Form。 ​ Camunda Modeler下载…

配置MySQL与登录模块

使用技术 MySQL&#xff0c;Mybatis-plus&#xff0c;spring-security&#xff0c;jwt验证&#xff0c;vue 1. 配置Mysql 1.1 下载 MySQL :: Download MySQL Installer 1.2 安装 其他页面全选默认即可 1.3 配置环境变量 将C:\Program Files\MySQL\MySQL Server 8.0\bin…

【Spring Boot 源码学习】BootstrapRegistry 初始化器实现

《Spring Boot 源码学习系列》 BootstrapRegistry 初始化器实现 一、引言二、往期内容三、主要内容3.1 BootstrapRegistry3.2 BootstrapRegistryInitializer3.3 BootstrapRegistry 初始化器实现3.3.1 定义 DemoBootstrapper3.3.2 添加 DemoBootstrapper 四、总结 一、引言 前面…