360校招编程题:内存管理
2016-09-10 22:06
155 查看
题目描述:
物联网技术的蓬勃发展,各种传感器纷纷出现,小B所在的项目组正在开放一个物联网项目,她们在研究设计一种新的传感器。这种传感器有自己的基本处理单元,具有一定的自主性,能够进行简单的数据收集、处理、存储和传输,为降低系统功耗并保证系统可靠性和可控性,她们要对内存进行基本的管理。研究小组计划开发一个实验性内存管理器,实现对内存的分配、释放和整理。对应的接口为new、del和def,使用语法:
new size:分配size字节大小的内存块,返回该内存的句柄handle,size为正整数;
del handle:释放句柄handle指向的内存块;
def:整理内存碎片,将所有已分配内存块按地址从低到高的顺序迁移,使空闲内存碎片在高地址端拼接在一起;
初始内存为initSize字节大小的整片空闲内存,编号为1到initSize。
new size操作中,若存在小于size的连续空闲内存,按照小地址优先的原则从空闲内存区域中分配size大小的内存块,标记该内存块状态为已分配,并返回指向该内存块的句柄。若无法分配,则返回空(NULL)。
del handle操作释放由handle标记的内存块,标记被释放的内存状态为空闲。若handle为无效句柄,则返回ILLEGAL_OPERARION。
def完成内存整理工作,无返回值。
根据设计,每次成功内存分配返回的句柄为一个正整数,从1开始,依次计数。失败的存储分配操作不影响计数。
项目小组将此项任务分配给小B,小B向你求助,你能帮助她吗?
输入:
输入中有多组测试数据,每组测试数据的第一行为两个正整数T和MaxMem(1<=T<=10000,1<=MaxMem<=10000),其中T为操作次数,MaxMem为初始内存大小,随后有T行操作指令。
输出:
对每组测试数据,按操作顺序输出操作结果。对每个new操作,在单独行中输出结果,成功时输出其返回句柄值,失败则输出NULL,若del操作失败,输出ILLEGAL_OPERATION。def不产生输出。
样例输入:
样例输出:
代码:
物联网技术的蓬勃发展,各种传感器纷纷出现,小B所在的项目组正在开放一个物联网项目,她们在研究设计一种新的传感器。这种传感器有自己的基本处理单元,具有一定的自主性,能够进行简单的数据收集、处理、存储和传输,为降低系统功耗并保证系统可靠性和可控性,她们要对内存进行基本的管理。研究小组计划开发一个实验性内存管理器,实现对内存的分配、释放和整理。对应的接口为new、del和def,使用语法:
new size:分配size字节大小的内存块,返回该内存的句柄handle,size为正整数;
del handle:释放句柄handle指向的内存块;
def:整理内存碎片,将所有已分配内存块按地址从低到高的顺序迁移,使空闲内存碎片在高地址端拼接在一起;
初始内存为initSize字节大小的整片空闲内存,编号为1到initSize。
new size操作中,若存在小于size的连续空闲内存,按照小地址优先的原则从空闲内存区域中分配size大小的内存块,标记该内存块状态为已分配,并返回指向该内存块的句柄。若无法分配,则返回空(NULL)。
del handle操作释放由handle标记的内存块,标记被释放的内存状态为空闲。若handle为无效句柄,则返回ILLEGAL_OPERARION。
def完成内存整理工作,无返回值。
根据设计,每次成功内存分配返回的句柄为一个正整数,从1开始,依次计数。失败的存储分配操作不影响计数。
项目小组将此项任务分配给小B,小B向你求助,你能帮助她吗?
输入:
输入中有多组测试数据,每组测试数据的第一行为两个正整数T和MaxMem(1<=T<=10000,1<=MaxMem<=10000),其中T为操作次数,MaxMem为初始内存大小,随后有T行操作指令。
输出:
对每组测试数据,按操作顺序输出操作结果。对每个new操作,在单独行中输出结果,成功时输出其返回句柄值,失败则输出NULL,若del操作失败,输出ILLEGAL_OPERATION。def不产生输出。
样例输入:
6 10 new 5 new 3 del 1 new 6 def new 6
样例输出:
1 2 NULL 3
代码:
import java.util.Scanner; public class Main { static int handle = 0; static int sum = 0;//用来计算总内存 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int T = scanner.nextInt(); int MaxMem = scanner.nextInt(); scanner.nextLine(); int[] arr = new int[T + 1];//用来存放句柄 arr[0] = -2; int[] sizeArr = new int[T + 1];//用来存放句柄对应的size for (int i = 0; i < T; i++) { String str = scanner.nextLine(); String op = str.split(" ")[0]; int size = 0; if (str.length() > 3) { size = Integer.parseInt(str.split(" ")[1]); } if (op.equals("new")) { sum += size; if (sum <= MaxMem) { handle++; arr[handle] = size; sizeArr[handle] = size; System.out.println(handle); } else { sum -= size; System.out.println("NULL"); } } else if (op.equals("del") && arr[size] != -1) { arr[size] = -1;//-1表示删除了该句柄 } else if (op.equals("del") && arr[size] == -1) { System.out.println("ILLEGAL_OPERATION"); } else if (op.equals("def")) { for (int j = 0; j < arr.length; j++) { if (arr[j] == -1) { sum -= sizeArr[j]; } } } } } } }
相关文章推荐
- 2017校招 360 笔试题 编程题 内存管理
- 2016 360校招笔试编程题
- 360 校招内存管理Java版
- 网易2017校招 [编程题] 最长公共子括号序列@Java
- 360编程题:挑选镇长
- 【优先队列】百度2018校招编程题—序列合并
- 网易2018校招编程题
- 去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码
- 滴滴打车And 360 校招 2016 在线笔试(三)
- 2017年校招全国统一模拟笔试(第一场)编程题集合——超级素数幂
- 华为2016校招笔试编程题(扑克牌大小)
- 腾讯校招编程题——算法基础-字符移位
- 腾讯2016校招编程题【PHP实现】
- 360的一道编程题
- 2017.09.08京东校招C/C++编程题-疯狂的序列
- 2017校招 美团笔试题 编程题 层次遍历多叉树
- 今日头条校招2016-09-28在线编程题(2题)
- 处理sys数据,简要回归2018校招当当的一道编程题
- 360 2013 校招笔试题
- 2016校招编程题汇总