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

来源:互联网 发布:数据库三大范式的理解 编辑:程序博客网 时间:2024/05/23 19:11

这里写图片描述
这里写图片描述
这里写图片描述
题目自行阅读,直接上代码:

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 10new 51new 32del 1new 6NULLdefnew 63

这里写图片描述

0 0
原创粉丝点击