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

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




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

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值