25.簡易內存池分配問題


有一個簡易內存池,內存按照大小粒度分類,每個粒度有若干個可用內存資源,用戶會進行一系列內存申請
需要按需分配內存池中的資源,返回申請結果成功失敗列表。


分配規則如下
1.分配的內存要大於等於內存的申請量,存在滿足需求的內存就必須分配,優先分配粒度小的,但內存不能拆分使用
2.需要按申請順序分配,先申請的先分配,有可用內存分配則申請結果為true,沒有可用則返回false
注釋:不考慮內存釋放

輸入描述
輸入為兩行字符串,第一行為內存池資源列表,包含內存粒度數據信息,粒度數據間用逗號分割
一個粒度信息內用冒號分割,冒號前為內存粒度大小,冒號后為數量
資源列表不大於1024,每個粒度的數量不大於4096

第二行為申請列表
申請的內存大小間用逗號分割,申請列表不大於100000


64:2,128:1,32:4,1:128
50,36,64,128,127

輸出描述
輸出為內存池分配結果
如true,true,true,false,false

示例一:
輸入:
64:2,128:1,32:4,1:128
50,36,64,128,127
輸出:
true,true,true,false,false

說明:
內存池資源包含:64k共2個、128k共1個、32k共4個、1k共128個的內存資源
針對50,36,64,128,127的內存申請序列,分配的內存依次是,64,64,128,null,null
第三次申請內存時已經將128分配出去,因此輸出的結果是true,true,true,false,false

 

查看代碼

import java.util.*;

public class Demo25 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] split = sc.nextLine().split(",");
        String[] asks = sc.nextLine().split(",");

        //用treeMap將大小和數量對應起來,並按大小排序
        TreeMap<Integer, Integer> map = new TreeMap<>();
        for(String s : split){
            Integer size = Integer.parseInt(s.split(":")[0]);
            Integer num = Integer.parseInt(s.split(":")[1]);
            map.put(size, num);
        }

        StringBuilder sb = new StringBuilder();
        ArrayList<Integer> list = new ArrayList<>(map.keySet()); //有參構造!!
        for(String s : asks){
            int flag = 0;
            for(int i : list){
                int ask = Integer.parseInt(s);
                if(ask <= i && map.get(i) > 0){
                    sb.append("true").append(",");
                    map.put(i, map.get(i) - 1); //更新內存池
                    flag = 1;
                    break;
                }
            }
            if(flag == 0){
                sb.append("false").append(",");
            }
        }
        System.out.println(sb.toString().substring(0, sb.length() - 1));
    }
}

 

總結:寫的時候一步一步就寫出來了,但是看到題目卻不能一眼看到思路,還是不夠熟練。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM