有一個簡易內存池,內存按照大小粒度分類,每個粒度有若干個可用內存資源,用戶會進行一系列內存申請
需要按需分配內存池中的資源,返回申請結果成功失敗列表。
分配規則如下
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));
}
}
總結:寫的時候一步一步就寫出來了,但是看到題目卻不能一眼看到思路,還是不夠熟練。