简易内存池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.hqwc.cn/news/504792.html

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

相关文章

每个人都应该知道的AI大模型:通往智能未来的桥梁

人工智能大模型已成为我们通往智能未来的桥梁。这些模型&#xff0c;如OpenAI的GPT-4&#xff0c;不仅是技术的巅峰&#xff0c;更是人类智慧的结晶。在这篇文章中&#xff0c;我们将深入探讨AI大模型的重要性&#xff0c;它们是如何工作的&#xff0c;以及它们对社会的潜在影响…

腾讯云4核8G12M服务器性能如何?使用场景分析

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

Vue路由(黑马程序员)

路由介绍 将资代码/vue-project(路由)/vue-project/src/views/tlias/DeptView.vue拷贝到我们当前EmpView.vue同级&#xff0c;其结构如下&#xff1a; 此时我们希望&#xff0c;实现点击侧边栏的部门管理&#xff0c;显示部门管理的信息&#xff0c;点击员工管理&#xff0c;显…

【Transformer】笔记

主要参考 https://zhuanlan.zhihu.com/p/366592542 https://mp.weixin.qq.com/s/b-_M8GPK7FD7nbPlN703HQ 其他参考 原理 https://zhuanlan.zhihu.com/p/627448301 多头注意力机制 https://zhuanlan.zhihu.com/p/611684065 https://blog.csdn.net/shizheng_Li/article/details/1…

双周回顾#006 - 这三个月

断更啦~~ 上次更新时间 2023/11/23, 断更近三个月的时间。 先狡辩下&#xff0c;因为忙、着实忙。因为忙&#xff0c;心安理得给断更找了个借口&#xff0c;批评下自己~~ 这三个月在做啥&#xff1f;跨部门援助&#xff0c;支援公司互联网的 ToC 项目&#xff0c;一言难尽。 …

破解SQL Server迷局,彻底解决“管道的另一端无任何进程错误233”

问题描述&#xff1a;在使用 SQL Server 2014的时候&#xff0c;想用 SQL Server 身份方式登录 SQL Servcer Manager&#xff0c;结果报错&#xff1a; 此错误消息&#xff1a;表示SQL Server未侦听共享内存或命名管道协议。 问题原因&#xff1a;此问题的原因有多种可能 管道…

用冒泡排序模拟C语言中的内置快排函数qsort!

目录 ​编辑 1.回调函数的介绍 2. 回调函数实现转移表 3. 冒泡排序的实现 4. qsort的介绍和使用 5. qsort的模拟实现 6. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免…

配置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…

嵌入式学习31-指针和函数知识回顾

1.指针&#xff1a; 1.提供一种间接访问数据的方法 2.空间没有名字,只有一个地址编号 2.指针: 1.地址:区分不同内存空间的编号 2.指针:指针就是地址,地址就是指针 3.指针变量:存放指针的变量称为指针变量,简称为指针 3.指针的定义: int *p NULL; …

学生云服务器_学生云主机_学生云数据库_云+校园特惠套餐

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

如果你在运行 conda 命令时收到了 ‘conda’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 的错误消息&#xff0c;这可能意味着 Anaconda 并没有正确地添加到你的系统路径中。 1.你可以尝试手动添加 Anaconda 到系统路径中。以下是在 Windows 系统上添加…

【风格迁移】DSM-GANs:为不同的域(照片和绘画风格)创建特定的映射函数,以改善风格转换的质量和准确性

DSM-GANs&#xff1a;为不同的域&#xff08;照片和绘画风格&#xff09;创建特定的映射函数&#xff0c;以改善风格转换的质量和准确性 提出背景DSM-GANs 域特定映射 域特定内容空间 针对性损失函数设计模型如何进行风格转换和图像到图像翻译 提出背景 论文&#xff1a;ht…