【kexin】摘录题目

1.简易内存池

package algorithm.huawei.interview;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeMap;

/**
  [简易内存池]
 请实现一个简易内存池,根据请求命令完成内存分配和释放。
 内存池支持两种操作命令,REQUEST和RELEASE,其格式为:
 REQUEST=请求的内存大小 表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;
       如果内存不足,或指定的大小为0,则输出error。
 RELEASE=释放的内存首地址 表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。
 5
 REQUEST=10
 REQUEST=20
 RELEASE=0
 REQUEST=20
 REQUEST=10

 8
 REQUEST=10
 REQUEST=19
 RELEASE=10
 RELEASE=9
 REQUEST=11
 REQUEST=52
 RELEASE=20
 RELEASE=19
 */
public class Interview39H {
    private static TreeMap<Integer,Integer> map = new TreeMap<>();
    public static int start = 0;
    public static int end = 100;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.parseInt(scanner.nextLine().trim());
        String[] strings = new String[n];
        for (int i = 0; i < n; i++) {
            strings[i] = scanner.nextLine().trim();
        }
        for (int i = 0; i < n; i++) {
            String[] split = strings[i].split("\\=");
            if(split[0].equals("REQUEST")){
                request(Integer.parseInt(split[1]));
            }else{
                release(Integer.parseInt(split[1]));
            }
        }
    }
    private static void release(int num) {
        if(map.containsKey(num)){
            map.remove(num);
        }else{
            System.out.println("error");
        }
    }


    private static void request(int num) {
        if(num <= 0 || num >100){
            System.out.println("error");
            return;
        }
        if(map.isEmpty()){
            map.put(start,num);
            System.out.println(start);
            return;
        }
        ArrayList<Integer> list = new ArrayList<>(map.keySet());
        int n = list.size();
        for (int i = 0; i < n; i++) {
            if(i == 0){
                if(list.get(0)-start >= num) {
                    map.put(start, num);
                    System.out.println(start);
                    return;
                }
            }else if(list.get(i) - list.get(i-1) - map.get(list.get(i-1)) >= num){
                map.put(list.get(i-1) + map.get(list.get(i-1)),num);
                System.out.println(list.get(i-1) + map.get(list.get(i-1)));
                return;
            }
        }
        if(end - list.get(n-1) - map.get(list.get(n-1)) >= num){
            map.put(list.get(n-1) + map.get(list.get(n-1)),num);
            System.out.println(list.get(n-1) + map.get(list.get(n-1)));
        }else{
            System.out.println("error");
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值