华为机试 - 简易内存池
admin
2024-03-18 17:10:08
0

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

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

注意:

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

输入描述

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

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

输出描述

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

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

用例

输入2
REQUEST=10
REQUEST=20
输出0
10
说明
输入5
REQUEST=10
REQUEST=20
RELEASE=0
REQUEST=20
REQUEST=10
输出0
10
30
0
说明

第一条指令,申请地址0~9的10个字节内存,返回首地址0

第二条指令,申请地址10~29的20字节内存,返回首地址10

第三条指令,释放首地址为0的内存申请,0~9地址内存被释放,变为空闲,释放成功,无需输出

第四条指令,申请20字节内存,09地址内存连续空间不足20字节,往后查找到3049地址,返回首地址30

第五条指令,申请10字节,0~9地址内存空间足够,返回首地址0

题目解析

我的解题思路如下:

定义一个used数组,用来存储已被占用的内存区间,即[起始位置,结束位置]。

初始化给used数组一个 [100,101],表示存在一个已占有内存区间[100,101],这个内存区间将作为尾边界使用。

当REQUEST申请size大小的内存时,我们从start=0位置开始申请,即申请[start, start+size-1]区间,接下来看该区间是否和used[i]区间存在交叉,如果存在交xian叉,则说明申请的内存区间中部分内存已被使用,因此我们应该更新 start = used[i][1] + 1位置,重新申请一个区间,这样就必然不和used[i]区间交叉了,但是要继续和used[i+1]区间比较。

直到找到一个不存在交叉的内存区间,打印此时的start,并将申请到的内存区间插入到used数组中,注意插入位置是 i 。

如果一直都找不到不存在交叉的内存区间,则打印error。

当RELEASE释放起始位置addr的内存时,我们只需要遍历每一个used[i],比较used[i][0]和addr是否相同,若相同,则表示找到了要释放的内存,此时只要将used[i]从used中删除即可。

如果没有找到,则打印error。

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
let n;
rl.on("line", (line) => {lines.push(line);if (lines.length === 1) {n = lines[0] - 0;}if (n && lines.length === n + 1) {lines.shift();getResult(lines.map((line) => line.split("=")));lines.length = 0;}
});function getResult(commands) {// used保存被占用的内存 [起始地址,结束地址],初始时有一个[100,101]作为尾边界限定const used = [[100, 101]];for (let [key, val] of commands) {// 申请内存if (key === "REQUEST") {// 当指令为REQUEST时,对应值为要申请的内存的大小,即sizeconst size = val - 0;// 我们默认从start=0位置开始检查可用内存区间let start = 0;let flag = true;for (let i = 0; i < used.length; i++) {let end = start + size - 1;// 要申请的内存区间const range = [start, end];// 检查要申请的内存区间和已占有的内存区间是否交叉if (!hasIntersection(used[i], range)) {// 若不存在交叉,则将申请区间加入used中used.splice(i, 0, range);flag = false;// 并打印此时申请区间的起始位置console.log(start);break;} else {// 若存在交叉,则将变更要申请的内存区间的起始位置start = used[i][1] + 1;}}// 一旦申请到内存,那么flag就会被赋值为false,否则就保持true,意味着每申请到内存,则打印errorif (flag) console.log("error");}// 释放内存else {//  当指令为RELEASE时,值为要释放内存的起始地址addrconst addr = val - 0;let flag = true;for (let i = 0; i < used.length; i++) {// 到已占有内存中找起始位置是addr的,找到则将该区间从used中删除,表示解除占用if (used[i][0] === addr) {used.splice(i, 1);flag = false;break;}}// 一旦释放成功,则flag就会被置为false,否则就保持True,意味着没有内存释放,则打印errorif (flag) console.log("error");}}
}// 判断两个区间是否存在交集
function hasIntersection(area1, area2) {const [s1, e1] = area1;const [s2, e2] = area2;if (s1 === s2) return true;else if (s1 < s2) return e1 >= s2;else return e2 >= s1;
}

相关内容

热门资讯

求一小说,刚开始女主登场被认为... 求一小说,刚开始女主登场被认为是男的,取名叫初一,男主很强。但我就是想不起来这书的名字!详细。。。就...
谁有青春失乐园第二季第四集的视... 谁有青春失乐园第二季第四集的视频,我急用,谁个我视频我顶他还不出啊....别那么心急,第四集很快就会...
她们都是红极一时,都做过谋女郎... 她们都是红极一时,都做过谋女郎,现在她们发展怎么样了?就拿章子怡来说吧,当时可是红极一时的谋女郎,现...
推荐经典爱情小说(送男朋友) 推荐经典爱情小说(送男朋友)最好是有收藏价值的。他不喜欢武侠的~最好是现代爱情经典小说 谢谢哦何以笙...
谁知道在哪可以看到《傲气至尊&... 谁知道在哪可以看到《傲气至尊>>326章之后的章节?、?起点和飞库都可以,不过要钱!你想看只有花钱,...
为什么人活着是沉的,死后浮呢?... 为什么人活着是沉的,死后浮呢?(特殊除外)死后在水里泡肿了 ,体积变大了,浮力也就变大了你在游泳的时...
我叫MT世界部落盗贼天赋怎么加... 我叫MT世界部落盗贼天赋怎么加点部落盗贼技能搭配攻略单人升级单人升级打副本没什么好说的,随便选四个伤...
霸情冷少,勿靠近好看吗 霸情冷少,勿靠近好看吗霸情冷少,勿靠近好看。霸情冷少,勿靠近的作者是沐小乌,剧情丰富精彩,角色刻画细...
国内最大的蝎子养殖基地在哪里 国内最大的蝎子养殖基地在哪里我们宿州市鑫盛蝎子养殖场,不是最大的,可以说是养殖技术最好的,欢迎登陆宿...
高中地理关于青藏高原的疑问 高中地理关于青藏高原的疑问青藏高原年均温在零度以下,可是小麦生长播种在16-18之间,为什么青藏高原...
巨亏超7500万!“高端零食第... 零食行业的“收获期”已经到来。 行业的回暖,带动了龙头企业估值的修复。资本市场的动作开始频繁,零食行...
求:经典立志小故事!(晨会要用... 求:经典立志小故事!(晨会要用)经典一些,公司是做广告的.晨会要我发言.我想说个小故事.立志的.太俗...
“传统医术+潮流体验” 铁西区... 入伏时节养生忙,7月18日傍晚,沈阳杉杉奥特莱斯购物广场人潮涌动、药香弥漫,铁西区第一届中医药文化市...
明日入伏,吃它可比吃肉强多了,... 明日入伏,吃它可比吃肉强多了,补充营养促进消化,家人特别爱吃! 随着三伏天的到来,高温潮湿的天气容...
拍婚纱照的趣事 拍婚纱照的趣事现在的婚纱照真的是很多花样哦! 婚纱 晚装 古装 样样都很精致! 摆了半天的姿势,连树...
因为天空它本来就是蓝的 因为天空它本来就是蓝的还要多久红光等波长的光穿越了大气层,蓝光紫光被大气层折射、反射,所有看到的天空...
浮岛物语最后一个饰品怎么获得 浮岛物语最后一个饰品怎么获得在铭文台制作。浮岛物语的装备书籍饰品的作用是提供经验加成。只要是这一类的...
路边的小花是一朵怎样的小花? 路边的小花是一朵怎样的小花?是一朵任由风吹雨打 依然灿烂的风险美丽的花
“又大又圆”造句? “又大又圆”造句?1、大青蛙长着两只又大又圆的眼睛,眼睛下面是一张又宽有扁的大嘴巴,鼓着白花花的大肚...