一、题目描述
有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源,用户会进行一系列内存申请,需要按需分配内存池中的资源,返回申请结果成功失败列表。
分配规则如下:
- 分配的内存要大于等于内存的申请量,存在满足需求的内存就必须分配,优先分配粒度小的,但内存不能拆分使用;
- 需要按申请顺序分配,先申请的先分配,有可用内存分配则申请结果为true;
- 没有可用则返回false;
注意:不考虑内存释放。
二、输入描述
输入两行字符串。
第一行为内存池资源列表,包含内存粒度数据信息、粒度数据间用逗号分隔,一个粒度信息内用冒号分隔,冒号前为内存粒度大小,冒号后为数量。
资源列表不大于1024,每个粒度数量不大于4096。
第二行为申请列表。
申请的内存大小间用逗号分隔,申请列表不大于100000。
三、输出描述
输出内存池分配结果。
四、解题思路
- 定义一个内存列表,并初始化数据;
- 定义一个申请列表,并初始化数据;
- 分配的内存要大于等于内存的申请量;
- 存在满足需求的内存就必须分配;
- 输出内存池分配结果;
五、Java算法源码
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 内存池资源列表
String memorys = in.nextLine();
// 申请列表
String applys = in.nextLine();
// 内存列表
List<Integer> memoryList = new ArrayList<>();
// 内存池资源列表
List<String> memoryInfoList = new ArrayList<>(Arrays.asList(memorys.split(",")));
for (String info : memoryInfoList) {
int colonIndex = info.indexOf(":");
// 内存粒度大小
int memorySize = Integer.parseInt(info.substring(0, colonIndex));
// 内存数量
int memoryCount = Integer.parseInt(info.substring(colonIndex + 1));
for (int i = 0; i < memoryCount; i++) {
memoryList.add(memorySize);
}
}
// 申请列表
List<Integer> applyList = new ArrayList<>();
List<String> applyListList = new ArrayList<String>(Arrays.asList(applys.split(",")));
for (String apply : applyListList) {
applyList.add(Integer.parseInt(apply));
}
// 内存分配结果
List<Boolean> memoryAllocationList = new ArrayList<Boolean>();
for (int applyMemory : applyList) {
boolean flag = false;
for (int i = 0; i < memoryList.size(); i++) {
// 分配的内存要大于等于内存的申请量
if (memoryList.get(i) >= applyMemory) {
// 存在满足需求的内存就必须分配
flag = true;
memoryList.remove(i);
break;
}
}
memoryAllocationList.add(flag);
}
// 输出内存池分配结果
for (int i = 0; i < memoryAllocationList.size(); i++) {
System.out.print(memoryAllocationList.get(i)+",");
}
}
六、效果展示
1、输入
8:1,16:1,32:1,64:1
60,12,24,60
2、输出
true,true,true,false
3、说明
60对应64,即为true;
12对应16,即为true;
24对应32,即为true;
60无可对应的内存,即为false;
4、如果改一下呢?
8:1,16:1,32:1,64:2
60,12,24,60
我猜会输出true,true,true,true,你觉得呢?
快来试试看吧。
🏆下一篇:华为OD机试真题(Java),跳跃游戏 II(100%通过+复盘思路)
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。