华为OD机试2025C卷-内存资源分配[100分]( Java _ Python3 _ C++ _ C语言 _ JsNode _ Go)实现100%通过率

📅 2026/6/28 1:02:39
华为OD机试2025C卷-内存资源分配[100分]( Java _ Python3 _ C++ _ C语言 _ JsNode _ Go)实现100%通过率
个人主页深夜coding算法 专栏系列2026年华为最新OD机试题库详解 一次订阅永久解锁 | 持续更新100篇 | 6语言全覆盖文章目录❄️前言☀️一题目描述 题目名称 题目内容 输入描述 输出描述 示例☀️二解题思路☀️三代码实现CJavaPython3C语言JavaScriptGo☀️四复杂度分析⭐ 五易错点坑1分配时优先地址最小坑2RELEASE 时找不到地址共勉❄️前言内存资源分配这题本质是在一个固定大小的存储里模拟分配和释放的操作。考的是对空闲块的管理——用数组/链表维护哪些区间还没被占分配时找第一个够大的块给它。☀️一题目描述 题目名称内存资源分配 题目内容有一个简易的内存池内存总大小为M字节编号 0 到 M-1。支持两种操作REQUESTN申请 N 字节的连续内存返回分配到的起始地址。优先分配地址最小的空闲块。如果没有足够大的连续空闲块返回-1RELEASEX释放以地址 X 为起始的已分配内存块 输入描述第一行整数M内存总大小接下来若干行每行一个操作直到输入结束 输出描述对每个REQUEST操作输出分配的起始地址或-1 示例输入 100 REQUEST10 REQUEST20 RELEASE0 REQUEST8 输出 0 10 0☀️二解题思路用数组mem[i]标记每个字节是否已分配。REQUEST 时扫描找连续 N 个空闲字节RELEASE 时根据起始地址找到对应块并释放。☀️三代码实现C#includeiostream#includestring#includevector#includemapusingnamespacestd;intmain(){intM;cinM;cin.ignore();vectorboolused(M,false);mapint,intallocs;// start - sizestring line;while(getline(cin,line)){if(line.rfind(REQUEST,0)0){intNstoi(line.substr(8));intstart-1;for(inti0;iM-N;i){booloktrue;for(intj0;jN;j)if(used[ij]){okfalse;break;}if(ok){starti;break;}}if(start!-1){for(intj0;jN;j)used[startj]true;allocs[start]N;}coutstartendl;}elseif(line.rfind(RELEASE,0)0){intXstoi(line.substr(8));if(allocs.count(X)){for(intj0;jallocs[X];j)used[Xj]false;allocs.erase(X);}}}}Javaimportjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);intMsc.nextInt();sc.nextLine();boolean[]usednewboolean[M];MapInteger,IntegerallocsnewHashMap();while(sc.hasNextLine()){Stringlinesc.nextLine();if(line.startsWith(REQUEST)){intNInteger.parseInt(line.substring(8));intstart-1;for(inti0;iM-N;i){booleanoktrue;for(intj0;jN;j)if(used[ij]){okfalse;break;}if(ok){starti;break;}}if(start!-1){for(intj0;jN;j)used[startj]true;allocs.put(start,N);}System.out.println(start);}elseif(line.startsWith(RELEASE)){intXInteger.parseInt(line.substring(8));if(allocs.containsKey(X)){for(intj0;jallocs.get(X);j)used[Xj]false;allocs.remove(X);}}}}}Python3Mint(input())used[False]*M allocs{}importsysforlineinsys.stdin:lineline.strip()ifline.startswith(REQUEST):Nint(line[8:])start-1foriinrange(M-N1):ifnotany(used[i:iN]):startibreakifstart!-1:forjinrange(start,startN):used[j]Trueallocs[start]Nprint(start)elifline.startswith(RELEASE):Xint(line[8:])ifXinallocs:forjinrange(X,Xallocs[X]):used[j]Falsedelallocs[X]C语言#includestdio.h#includestring.hintmain(){intM,used[1024]{0},allocs[1024]{0};scanf(%d\n,M);charline[128];while(fgets(line,sizeof(line),stdin)){if(strncmp(line,REQUEST,8)0){intN,start-1;sscanf(line8,%d,N);for(inti0;iM-N;i){intok1;for(intj0;jN;j)if(used[ij]){ok0;break;}if(ok){starti;break;}}if(start!-1){for(intj0;jN;j)used[startj]1;allocs[start]N;}printf(%d\n,start);}elseif(strncmp(line,RELEASE,8)0){intX;sscanf(line8,%d,X);if(allocs[X]){for(intj0;jallocs[X];j)used[Xj]0;allocs[X]0;}}}}JavaScriptconstinputrequire(fs).readFileSync(0,utf-8).trim().split(\n);constMinput[0];constusedArray(M).fill(false);constallocsnewMap();for(letk1;kinput.length;k){constlineinput[k];if(line.startsWith(REQUEST)){constNline.slice(8);letstart-1;for(leti0;iM-N;i){letoktrue;for(letj0;jN;j)if(used[ij]){okfalse;break;}if(ok){starti;break;}}if(start!-1){for(letj0;jN;j)used[startj]true;allocs.set(start,N);}console.log(start);}elseif(line.startsWith(RELEASE)){constXline.slice(8);if(allocs.has(X)){for(letj0;jallocs.get(X);j)used[Xj]false;allocs.delete(X);}}}Gopackagemainimport(bufio;fmt;os;strconv;strings)funcmain(){scanner:bufio.NewScanner(os.Stdin)scanner.Scan()M,_:strconv.Atoi(scanner.Text())used:make([]bool,M)allocs:map[int]int{}forscanner.Scan(){line:scanner.Text()ifstrings.HasPrefix(line,REQUEST){N,_:strconv.Atoi(line[8:])start:-1fori:0;iM-N;i{ok:trueforj:0;jN;j{ifused[ij]{okfalse;break}}ifok{starti;break}}ifstart!-1{forj:0;jN;j{used[startj]true}allocs[start]N}fmt.Println(start)}elseifstrings.HasPrefix(line,RELEASE){X,_:strconv.Atoi(line[8:])ifn,ok:allocs[X];ok{forj:0;jn;j{used[Xj]false}delete(allocs,X)}}}}☀️四复杂度分析指标数值时间复杂度O(M * 操作数)空间复杂度O(M)⭐ 五易错点坑1分配时优先地址最小扫描时从地址 0 开始找到第一个就停——这就是最优的。坑2RELEASE 时找不到地址如果释放的地址没有对应分配记录应忽略不要报错。共勉OD机试必考模拟题这道内存分配题学会了类似的时间片调度、资源池管理就都能做。关于本专栏一次订阅永久解锁全部100篇真题详解6语言全覆盖Java | Python3 | C | C语言 | JsNode | Go