简易内存池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;一&…

Java的强引用、软引用、弱引用和虚引用详解。

Java的强引用、软引用、弱引用和虚引用 1. 强引用2. 软引用3. 弱引用4. 虚引用 总结 Java的强引用、软引用、弱引用和虚引用可以用来标识GC时判断对象是否达到回收的条件&#xff0c;下面结合Java代码看看这四类引用吧。 1. 强引用 是最普通的引用方式&#xff0c;通过new关键…

外贸业务员没客户的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 在集合通…

C++调用PyTorch模型教程

在人工智能的世界中&#xff0c;PyTorch已经成为了研究人员和工程师们广泛使用的深度学习框架之一。它以其灵活性和动态计算图而闻名&#xff0c;非常适合快速原型设计和实验。然而&#xff0c;当我们想要将训练好的模型部署到生产环境中时&#xff0c;我们可能会倾向于使用C这…

老卫带你学---leetcode刷题(172. 阶乘后的零)

172. 阶乘后的零 问题 给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * … * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#xff1a;3! 6 &#xff0c;不含尾随 0 示例 2&#xff1a; 输入…

Java Web之网页开发基础复习

tomcat之网页开发基础复习 **声明** :HTML标准规范 </!doctype> <html> : 根标签 <head>: 头部标签 内含<title><meta><link><style> <body>: 主体 <body></body> html标签 单标签: <标签名 \> 双标…

Python线性代数数字图像和小波分析之二

要点 数学方程&#xff1a;数字信号和傅里叶分析&#xff0c;离散时间滤波器&#xff0c;小波分析Python代码实现及应用变换过程&#xff1a; 读取音频和处理音频波&#xff0c;使用Karplus-强算法制作吉他音频离散傅里叶计算功能和绘制图示结果计算波形傅里叶系数正向和反向&…