【华为OD】D卷真题100分:内存资源分配 Java代码实现[思路+代码]

【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript

【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript-CSDN博客

题目描述:

有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源,用户会进行一系列内存申请,需要按需分配内存池中的资源,返回申请结果成功失败列表。分配规则如下:

1、分配的内存要大于等于内存申请量,存在满足需求的内存就必须分配,优先分配粒度小的,但内存不能拆分使用。

2、需要按申请顺序分配,先申请的先分配。

3、有可用内存分配则申请结果为true,没有可用内存分配则返回false。

注:不考虑内存释放。

输入描述

输入为两行字符串:
第一行为内存池资源列表,包含内存粒度数据信息,粒度数据间用逗号分割,一个粒度信息内部用冒号分割,冒号前为内存粒度大小,冒号后为数量。资源列表不大于1024,每个粒度的数量不大于4096
第二行为申请列表,申请的内存大小间用逗号分隔。申请列表不大于100000
如:
64:2,128:1,32:4,1:128
50,36,64,128,127

输出描述

输出为内存池分配结果。
如:
true,true,true,false,false

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

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

备注

     wumu1024                                                         
                                                            
              +---+                                                          
  3            |   |       ++                               +       +---|   
  |           |   | 3      +                6               +  |   +   |        +
  |      +     |   |       +         +                      +    |  +   |       +
  |      +    |   +---+    +        +        +++++          +   +  +   |        +
  |      +    | +      |   +   +----+        |   |          +   +  +   |        +
  |      +  3 | +      |   +   +    +      2 |   |     2    +   +  +   |        +
  |      +    | +      |   +   +    +        |   |          +   +  +   |        +
  |      +---+ +     |    |  |    +    ----+   |   +---+    |  |  +   |         +
  |      |     +     |    |  |    +    |       |   |   |    |  |  +   |         +
  |    1 |     +     | 8  |  |    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  |      |     +     |    |  |    +    |   |    |   |   |   |   |  +   |        +
  |  +---+     +     +---+   |    ++---+    ++   +---+   +---+   |  +   |        +
  |  |         +         |   |    |         ++              |   |  |+   |        +
  |0 |         +         | 0 |  0 |         ++              | 0 |  |+   |        +
  |  |         +         |   |    |         ++              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12 + v:    w  u m    u 1 0 2 4
 

题目解析:

        按逻辑来处理即可,做好字符串拆分

代码实现:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Main {

    public static List<Integer> readLine(Scanner input) {
        String str = input.next();
        return Arrays.stream(str.split("[,:]")).map(Integer::parseInt).collect(Collectors.toList());
    }

    public static Boolean alloc(int[][] mem, int value) {
        for (int i = 0; i < mem.length; ++i) {
            if (mem[i][1] > 0 && mem[i][0] >= value) {
                mem[i][1] -= 1;
                return true;
            }
        }

        return false;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        List<Integer> line1 = readLine(input);
        List<Integer> line2 = readLine(input);
        int n = line1.size() / 2;
        int[][] mem = new int[n][2];
        for (int i = 0; i < n; ++i) {
            mem[i][0] = line1.get(i * 2);
            mem[i][1] = line1.get(i * 2 + 1);
        }
        Arrays.sort(mem, Comparator.comparingInt(i -> i[0]));


        StringBuffer buffer = new StringBuffer();
        for (Integer value : line2) {
            buffer.append(alloc(mem, value)).append(",");
        }
        if (buffer.length() > 0) {
            buffer.deleteCharAt(buffer.length() - 1);
            System.out.println(buffer);
        } else {
            System.out.println("");
        }
    }
}

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五木大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值