360的笔试编程题之内存管理

360的笔试编程题之内存管理_第1张图片
360的笔试编程题之内存管理_第2张图片
360的笔试编程题之内存管理_第3张图片
题目自行阅读,直接上代码:




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;i0;
        }
        //内存分配的handler
        int handle = 0;
        //保存handler和内存大小
        Map map= new HashMap();
        //保存handler以及是否删除
        Map mapnode= new HashMap();
        //保存handler以及对应数组坐标
        Map mapindex= new HashMap();
        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;i1;
                    }
                    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;i0;
                }
            }
            if (op.equals("def")){
                //计算空闲空间
                int count=getIdel(arr);
                for (int i=0;iif (icount){
                        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;iif (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;iif (arr[i]==0){
                count++;
            }
        }
        return count;
    }
}

输出结果:

6 10
new 5
1
new 3
2
del 1
new 6
NULL
def
new 6
3

360的笔试编程题之内存管理_第4张图片

你可能感兴趣的:(java语言学习)