2024年华为OD机试真题-简易内存池 C/C++解法

使用链表记录已分配的内存起始地址和大小,后续分配和释放基于此链表

cpp 复制代码
#include <iostream>
#include <string>
#include <algorithm>
#include <list>

using namespace std;

// 简易内存池
static void HuaWei_OD_test25(void)
{
    // 请求分配指定大小内存时,如果分配成功,返回分配到的内存首地址;
    // 如果内存不足,或指定的大小为0,则输出error。
    // 释放掉之前分配的内存时,释放成功无需输出,如果释放不存在的首地址则输出error。

    int cmd_cnt;
    cin >> cmd_cnt;

#define REQUEST_CMD 0
#define RELEASE_CMD 1

    // 命令序列,这里pair的first代表了命令类型,0为申请,1为释放
    // pair的second,对于request代表了申请内存的大小,
    // 对于release代表了释放内存的首地址
    vector<pair<int, int>> cmd_vec;

    for (int i = 0; i < cmd_cnt; i++)
    {
        string cmd;
        cin >> cmd;

        auto find_delim = cmd.find('=', 0);
        string val_str = cmd.substr(find_delim + 1, -1);
        int val = atoi(val_str.c_str()); // 获得值

        if (cmd.find("REQUEST") != string::npos)
        {
            // 内存申请命令
            cmd_vec.push_back(std::make_pair(REQUEST_CMD, val));
        }
        else if (cmd.find("RELEASE") != string::npos)
        {
            // 内存释放命令
            cmd_vec.push_back(std::make_pair(RELEASE_CMD, val));
        }
    }

    // 记录成功分配的内存首地址和大小
    struct little_mem
    {
        int start_addr;
        int size;
    };

    list<little_mem> mem_allocate_list;

    for (int i = 0; i < cmd_vec.size(); i++)
    {
        // 释放操作
        if (cmd_vec[i].first == RELEASE_CMD)
        {
            // 释放不存在的首地址输出 error
            auto match_pos = std::find_if(
                mem_allocate_list.begin(), mem_allocate_list.end(),
                [=](const little_mem &mem)
                {
                    if (mem.start_addr == cmd_vec[i].second)
                        return true;                  
                    return false; });

            // 当内存成功申请列表为空,或者找不到此命令对应内存的起始地址
            if (mem_allocate_list.empty() || match_pos == mem_allocate_list.end())
            {
                cout << "error\n";
            }
            else
            {
                // 成功释放,将对应申请内存记录从mem_allocate_list排除
                mem_allocate_list.erase(match_pos);
            }
        }

        // 申请操作
        else if (cmd_vec[i].first == REQUEST_CMD)
        {
            // 如果申请内存大小为0,输出error
            if (cmd_vec[i].second == 0)
            {
                cout << "error\n";
            }

            // 当此时申请内存大小超出限制,输出error
            if (cmd_vec[i].second > 100)
            {
                cout << "error\n";
            }

            int start_base = 0; // 内存申请起始地址

            for (const auto &mem : mem_allocate_list)
            {
                // 如果[start_base, start_base + cmd_vec[i].second]
                // 与[mem.start_addr, mem.start_addr + mem.size]
                // 有重合则start_base向后移

                // 区域交叉情况1
                bool cross_1 = (start_base + cmd_vec[i].second > mem.start_addr &&
                                start_base + cmd_vec[i].second <= mem.start_addr + mem.size);

                // 区域交叉情况2
                bool cross_2 = (start_base >= mem.start_addr &&
                                start_base <= mem.start_addr + mem.size);

                if (cross_1 || cross_2)
                {
                    start_base = mem.start_addr + mem.size;
                }
            }

            if (start_base + cmd_vec[i].second < 100)
            {
                cout << start_base << endl;
                little_mem new_mem;
                new_mem.start_addr = start_base;
                new_mem.size = cmd_vec[i].second;
                mem_allocate_list.push_back(new_mem);
            }
        }
    }
}

int main()
{
    HuaWei_OD_test25();
    return 0;
}
相关推荐
幺零九零零1 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
捕鲸叉1 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
Dola_Pan2 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
yanlou2332 小时前
KMP算法,next数组详解(c++)
开发语言·c++·kmp算法
小林熬夜学编程2 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺3 小时前
嵌入式之C语言(基础篇)
c语言·开发语言
躺不平的理查德3 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
阿洵Rain3 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法
Liknana3 小时前
C++ shared_ptr 动态内存
开发语言·c++
Daking-3 小时前
「STL::array」标准库容器:array(数组)介绍(C++)
开发语言·c++