题目自行阅读,直接上代码:
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
int T = cin.nextInt();
int MaxMem = cin.nextInt();
//用数组模拟内存
int[] arr = new int[MaxMem];
for (int i=0;i<arr.length;i++){
arr[i]=0;
}
//内存分配的handler
int handle = 0;
//保存handler和内存大小
Map map= new HashMap<Integer,Integer>();
//保存handler以及是否删除
Map mapnode= new HashMap<Integer,Boolean>();
//保存handler以及对应数组坐标
Map mapindex= new HashMap<Integer,Boolean>();
while(T>0){
String op = cin.next();
if (op.equals("new")){
int men = cin.nextInt();
//查询内存最大空闲值及坐标
int[] index = findMaxMem(arr);
int inx = index[0];
int len = index[1];
int left = len-men;
if (left>0){//有足够空间申请
handle++;
map.put(handle,men);
mapnode.put(handle,true);
mapindex.put(handle,inx);
//将新的空间赋予数组
for (int i=0;i<men;i++){
arr[inx++]=1;
}
System.out.println(handle);
}else{//没有足够空间申请
System.out.println("NULL");
}
}
if (op.equals("del")){
int had = cin.nextInt();
if (!map.containsKey(had)){
throw new RuntimeException("ILLEGAL_OPERATION");
}
mapnode.put(had,false);
int inx = (int) mapindex.get(had);
int delmen= (int) map.get(had);
//将指定空间恢复为0
for (int i=0;i<delmen;i++){
arr[inx++]=0;
}
}
if (op.equals("def")){
//计算空闲空间
int count=getIdel(arr);
for (int i=0;i<arr.length;i++){
if (i<arr.length-count){
arr[i]=1;
}
else arr[i]=0;
}
}
T--;
}
}
//找到数组中最大空闲数以及起始坐标
private static int[] findMaxMem(int[] arr){
int max=0;
int count=0;
int maxIndex=0;
int maxIndexstart=0;
for(int i=0;i<arr.length;i++){
if (arr[i]==0){
if (i==0){
maxIndexstart=0;
}else if (arr[i-1]==1){
maxIndexstart=i;
}
count++;
}else{
if (count>max) {
maxIndex=maxIndexstart;
max=count;
}
count=0;
}
}
if (count>max) {
max=count;
maxIndex=maxIndexstart;
}
int []res=new int[2];
res[0]=maxIndex;
res[1]=max;
return res;
}
private static int getIdel(int[] arr){
int count=0;
for (int i=0;i<arr.length;i++){
if (arr[i]==0){
count++;
}
}
return count;
}
}
输出结果:
6 10
new 5
1
new 3
2
del 1
new 6
NULL
def
new 6
3