当前位置: 首页 > article >正文

【华为OD机试真题】堆内存申请 · 堆内存最佳分配(C语言)

一、真题题目描述有一个总空间为100字节的堆现要从中申请一块内存内存分配原则为优先紧接着前一块已使用内存分配空间足够且最接近申请大小的空闲内存。输入描述第1行是1个整数表示期望申请的内存字节数。第2到第N行是用空格分割的两个整数表示当前已分配的内存的情况每一行表示一块已分配的连续内存空间每行的第1和第2个整数分别表示偏移地址和内存块大小如0 1 3 2表示0偏移地址开始的1个字节和3偏移地址开始的2个字节已被分配其余内存空闲。输出描述若申请成功输出申请到内存的偏移若申请失败输出-1。备注若输入信息不合法或无效则申请失败若没有足够的空间供分配则申请失败堆内存信息有区域重叠或有非法值等都是无效输入示例1输入1 0 1 3 2输出说明堆中已使用的两块内存是偏移从0开始的1字节和偏移从3开始的2字节空闲的两块内存是偏移从1开始2个字节和偏移从5开始95字节。根据分配原则新申请的内存应从1开始分配1个字节所以输出偏移为1。二、解题思路图解步骤 1数据结构设计由于 C 语言没有内置的动态列表我们需要定义一个结构体MemoryBlock并使用数组或动态分配的指针数组来存储已分配的块。考虑到机考题通常数据量不大一般 N≤1000 我们可以预设一个足够大的数组MAX_BLOCKS。typedef struct { int offset; int size; int end; // offset size } MemoryBlock;步骤 2数据读取与排序读取reqSize。循环读取offset和size直到文件结束EOF。排序使用qsort库函数按offset升序排列。这是检测重叠和计算空闲块的前提。步骤 3数据清洗与校验基础校验遍历数组检查offset 0、size 0或end 100。重叠检测遍历排序后的数组检查current.offset prev.end。注意[0, 1)和[1, 2)是紧邻但不重叠的判断条件必须是严格小于。步骤 4贪心匹配 (Best Fit)不需要额外分配内存存储空闲块采用一次扫描法维护currentPos当前扫描到的位置初始为0。维护bestOffset最佳起始位置和minDiff最小剩余空间差值初始化为-1和INT_MAX。遍历每个已分配块若block.offset currentPos发现空闲区间[currentPos, block.offset)。计算长度freeSize若满足条件则尝试更新最优解。更新currentPos block.end。尾部检查若currentPos 100检查最后一段空闲区。三、C语言实现代码#include stdio.h #include stdlib.h #include limits.h #include stdbool.h #define MAX_BLOCKS 1005 #define TOTAL_SIZE 100 // 定义内存块结构体 typedef struct { int offset; int size; int end; } MemoryBlock; // qsort 比较函数按 offset 升序排序 int compareBlocks(const void *a, const void *b) { const MemoryBlock *blockA (const MemoryBlock *)a; const MemoryBlock *blockB (const MemoryBlock *)b; return blockA-offset - blockB-offset; } int main() { int reqSize; // 1. 读取申请大小 if (scanf(%d, reqSize) ! 1) { printf(-1\n); return 0; } // 基本合法性检查 if (reqSize 0) { printf(-1\n); return 0; } MemoryBlock blocks[MAX_BLOCKS]; int count 0; int offset, size; // 2. 读取已分配内存块直到 EOF // scanf 返回成功匹配的项数若不为 2 则停止处理末尾换行或非法格式 while (scanf(%d %d, offset, size) 2) { if (count MAX_BLOCKS) { // 防止数组越界虽然题目通常不会给这么多 printf(-1\n); return 0; } blocks[count].offset offset; blocks[count].size size; blocks[count].end offset size; count; } // 如果没有已分配块count 为 0逻辑依然成立 // 3. 排序 qsort(blocks, count, sizeof(MemoryBlock), compareBlocks); // 4. 校验与重叠检测 for (int i 0; i count; i) { // 基础校验负数、零大小、越界 if (blocks[i].offset 0 || blocks[i].size 0 || blocks[i].end TOTAL_SIZE) { printf(-1\n); return 0; } // 重叠检测 if (i 0) { // 如果当前块的起点 前一块的终点则重叠 if (blocks[i].offset blocks[i-1].end) { printf(-1\n); return 0; } } } // 5. 贪心查找最佳适配 (Best Fit) int bestOffset -1; int minDiff INT_MAX; int currentPos 0; for (int i 0; i count; i) { // 检查当前块之前的空闲区域 if (blocks[i].offset currentPos) { int freeSize blocks[i].offset - currentPos; if (freeSize reqSize) { int diff freeSize - reqSize; // 寻找差值最小的最接近 // 若 diff 相等由于是从左向右遍历保留较小的 offset (即不更新) if (diff minDiff) { minDiff diff; bestOffset currentPos; } } } // 移动当前位置到当前块的结束处 currentPos blocks[i].end; } // 6. 检查尾部空闲区域 if (currentPos TOTAL_SIZE) { int freeSize TOTAL_SIZE - currentPos; if (freeSize reqSize) { int diff freeSize - reqSize; if (diff minDiff) { minDiff diff; bestOffset currentPos; } } } // 7. 输出结果 printf(%d\n, bestOffset); return 0; }C语言代码亮点底层控制直接使用struct和数组无额外封装开销内存占用极低。标准库排序利用qsort高效完成排序时间复杂度 O(Nlog⁡N) 。鲁棒的输入处理通过scanf返回值判断输入结束能够正确处理多行输入及末尾空白。极限值处理使用limits.h中的INT_MAX初始化最小差值确保逻辑严密。单次扫描在 O(N) 时间内完成所有空闲区的评估无需二次遍历或额外存储空间。四、核心逻辑推演以示例为例输入1 0 1 3 2执行流程解析reqSize 1。块1{0, 1, 1}块2{3, 2, 5}count 2。排序已有序。校验块10~1合法。块23~5合法。重叠3 1无重叠。扫描currentPos 0,minDiff INT_MAX,bestOffset -1。i0 (块1):offset(0) currentPos(0)无空闲。currentPos更新为1。i1 (块2):offset(3) currentPos(1)。空闲大小2。2 1差值1。1 INT_MAX更新minDiff1,bestOffset1。currentPos更新为5。尾部:currentPos(5) 100。空闲大小95。95 1差值94。94 1不更新。输出1。五、易错点总结⚠️scanf 的返回值很多初学者忽略scanf的返回值。在循环读取不定行数时必须检查 2否则可能陷入死循环或读取错误数据。数组越界C语言不会自动检查数组边界。必须定义足够大的MAX_BLOCKS并在写入前检查count防止 Segmentation Fault。重叠判断符号再次强调[0, 1)和[1, 2)是合法的。判断重叠必须用。若误用会导致相邻块被误判。整数溢出虽然本题数值很小100但在通用内存分配场景中offset size可能会溢出int范围。在实际工程中建议使用long long或进行溢出检查。未初始化变量minDiff必须初始化为最大值bestOffset初始化为-1否则在没有任何合适空闲块时会输出垃圾值。六、复杂度分析时间复杂度排序 O(Nlog⁡N) 。线性扫描 O(N) 。总计 O(Nlog⁡N) 。C语言的常数因子极小执行速度极快。空间复杂度O(N) 用于存储结构体数组。辅助变量 O(1) 。七、结语这道题是考察贪心算法、区间处理以及C语言基本功的绝佳素材。通过手动管理结构体数组、使用qsort以及精细的指针/索引操作我们不仅解决了算法问题更重温了C语言作为“系统编程语言”的魅力。掌握这种“排序 - 扫描 - 贪心”的三段式解法配合C语言的高效执行你将能轻松应对各类资源分配、区间覆盖类的机考题目。祝各位Coder代码无BugOffer 滚滚来

相关文章:

【华为OD机试真题】堆内存申请 · 堆内存最佳分配(C语言)

一、真题题目描述:有一个总空间为100字节的堆,现要从中申请一块内存,内存分配原则为:优先紧接着前一块已使用内存,分配空间足够且最接近申请大小的空闲内存。输入描述:第1行是1个整数,表示期望申…...

春秋云境CVE-2013-2251

1.阅读靶场介绍 这里得到的有用信息是Apache Struts 2.启动靶场 如下所示 3.poc 尝试在路径后构造.action的url 这里我试出来的是 https://eci-2ze7xm2tms3a876w7wv3.cloudeci1.ichunqiu.com:8080/index.action 发现能正常使用 下一步启动天狐工具箱(想要的请…...

UniApp多环境配置实战:Vite插件实现微信/支付宝小程序动态切换

UniApp多环境配置实战:Vite插件实现动态切换的工程化方案 在跨平台小程序开发中,经常遇到需要为不同客户定制不同版本的需求。每次手动修改配置不仅效率低下,还容易出错。本文将分享一套基于Vite插件的自动化解决方案,实现UniApp项…...

COMSOL三次谐波与光学仿真:探索光学性能与电磁场相互作用

comsol三次谐波仿真,光学仿真最近在折腾非线性光学仿真的时候,第三次被三次谐波生成的问题卡脖子了。COMSOL这玩意儿就像个傲娇的猫主子,参数调不对分分钟给你摆烂。今天就跟大伙唠唠怎么用波动方程模块驯服这个磨人的小妖精。先打开电磁波频…...

Socket.IO vs WebSocket:如何为你的项目选择最佳实时通信方案?

Socket.IO与WebSocket深度对比:从技术本质到选型决策 实时通信技术已经成为现代Web应用的标配能力,但面对琳琅满目的技术方案,开发者常常陷入选择困境。当项目需要实现聊天室、实时数据看板或多人在线协作等功能时,Socket.IO和原生…...

原神智能助手BetterGI:自动化游戏体验创新方案

原神智能助手BetterGI:自动化游戏体验创新方案 【免费下载链接】better-genshin-impact 🍨BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools For Genshi…...

结合aibiye爱毕业等8款AI工具,论文写作与程序开发效率显著提高,AI技术为毕业设计提供智能化支持

文章总结表格(工具排名对比) 工具名称 核心优势 aibiye 精准降AIGC率检测,适配知网/维普等平台 aicheck 专注文本AI痕迹识别,优化人类表达风格 askpaper 快速降AI痕迹,保留学术规范 秒篇 高效处理混AIGC内容&…...

leetcode 困难题 耗时100内存100 1483. Kth Ancestor of a Tree Node 树节点的第 K 个祖先

Problem: 1483. Kth Ancestor of a Tree Node 树节点的第 K 个祖先 耗时100%,内存100%,parent列表里面都不是叶子节点,用状态数组标记非叶子节点,对所有叶子节点,用数组tmp记录当前叶子节点到根节点0的路径&#xff0c…...

GinCdn内容分发系统V1.0.3更新内容

GinCdn内容分发系统GinCdn是一款基于Go语言Gin框架自研的轻量高效内容分发系统,专为中小型企业/个人搭建CDN打造。依托Go高性能特性,采用主控边缘节点分布式架构,实现智能调度、高效缓存、精准监控的一体化解决方案。无需复杂命令行&#xff…...

3分钟激活微信消息自动转发:零门槛配置实现跨群智能流转

3分钟激活微信消息自动转发:零门槛配置实现跨群智能流转 【免费下载链接】wechat-forwarding 在微信群之间转发消息 项目地址: https://gitcode.com/gh_mirrors/we/wechat-forwarding 在信息爆炸的今天,微信群消息的高效管理成为团队协作的关键。…...

解锁声音魔法:Voice Changer创意应用全攻略

解锁声音魔法:Voice Changer创意应用全攻略 【免费下载链接】voice-changer リアルタイムボイスチェンジャー Realtime Voice Changer 项目地址: https://gitcode.com/gh_mirrors/vo/voice-changer 在数字创意领域,实时语音变换技术正成为内容创作…...

LFM2.5-1.2B-Thinking-GGUF部署案例:Docker Compose编排+GPU显存隔离实践

LFM2.5-1.2B-Thinking-GGUF部署案例:Docker Compose编排GPU显存隔离实践 1. 平台简介 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型,特别适合在资源有限的环境中快速部署。该镜像内置了GGUF模型文件和llama.cpp运行时,提…...

LFM2.5-1.2B-Thinking-GGUF保姆级教程:max_tokens=512防空响应设置法

LFM2.5-1.2B-Thinking-GGUF保姆级教程:max_tokens512防空响应设置法 1. 模型简介 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型,专为低资源环境优化设计。这个1.2B参数的模型采用GGUF格式,配合llama.cpp运行时&#xff0…...

TOGAF企业架构师认证:从入门到精通的全景指南

1. TOGAF认证的核心价值与职业红利 第一次接触TOGAF是在2015年参与某银行系统改造项目时,甲方架构团队全员佩戴着TOGAF徽章。当时作为开发负责人的我,深刻感受到这套方法论在大型企业转型中的实际威力——它让原本混乱的需求讨论变得条理清晰。如今八年过…...

因果推断利器:用Stata实战断点回归(RDD)的政策效应评估

1. 断点回归:政策评估的黄金标准 第一次接触断点回归(RDD)是在评估某地助学金政策时。当地教育局规定:家庭人均收入低于1200元的学生自动获得助学金。这个明确的"分数线"让我意识到,这简直就是天然的实验设计——就像在实验室里随…...

OpenClaw本地模型省钱方案:GLM-4.7-Flash自部署与API调用对比

OpenClaw本地模型省钱方案:GLM-4.7-Flash自部署与API调用对比 1. 为什么需要关注OpenClaw的模型成本? 当我第一次用OpenClaw自动整理电脑上的2000多份PDF文献时,第二天查看账单发现消耗了价值37元的API Token——这还只是单次任务。作为长期…...

OpCore Simplify:开源智能配置工具重塑黑苹果EFI生成体验

OpCore Simplify:开源智能配置工具重塑黑苹果EFI生成体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 黑苹果配置过程中,硬…...

KeySim:如何通过3D虚拟设计打造你的梦想键盘?

KeySim:如何通过3D虚拟设计打造你的梦想键盘? 【免费下载链接】keysim design and test virtual 3d keyboards. 项目地址: https://gitcode.com/gh_mirrors/ke/keysim 在键盘爱好者的世界里,每一款键盘都是个性与功能的完美结合&#…...

Qwen3.5-4B-Claude-Opus入门指南:理解‘Opus-Reasoning-Distilled’命名含义

Qwen3.5-4B-Claude-Opus入门指南:理解Opus-Reasoning-Distilled命名含义 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个基于Qwen3.5-4B的推理蒸馏模型,特别强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。这个…...

Agent-S深度解析:首个超越人类性能的智能体框架实战指南

Agent-S深度解析:首个超越人类性能的智能体框架实战指南 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S Agent-S作为开源智能体框架&#xff0c…...

Beyond Compare在Ubuntu/Debian上的终极配置指南:过期处理+菜单修复

Beyond Compare在Ubuntu/Debian上的深度配置与疑难排解 作为一款强大的文件对比工具,Beyond Compare在Linux环境下常遇到两个高频问题:许可证过期提示和右键菜单缺失。本文将深入解析问题根源,并提供多种解决方案,同时分享一些提升…...

123页PPT华为IPD流程体系建设与运营方案:流程体系、指标体系、卓越运营、业务转型与数字化、流程管理、流程成熟度评估模型

华为IPD流程体系建设与运营方案》是华为流程管理体系建设的全景式指南,系统阐述了华为如何以IPD(集成产品开发)为核心,构建端到端的流程体系、指标体系、卓越运营机制、流程型组织与数字化转型体系,支撑其全球业务高速…...

微信小程序人脸核身功能避坑指南:从申请到调用的完整流程

微信小程序人脸核身功能深度解析:从资质审核到性能优化的全链路实践 在数字化身份验证领域,人脸核身技术已成为中小企业和独立开发者构建安全认证体系的首选方案。微信小程序提供的wx.startFacialRecognitionVerify接口,将公安部权威数据源与…...

LabVIEW新手必看:NI-DAQmx驱动安装全攻略(2021/2022版通用)

LabVIEW数据采集实战:NI-DAQmx驱动安装与版本适配指南 刚接触LabVIEW的工程师们,是否曾被数据采集项目的硬件驱动问题困扰?作为NI生态的核心组件,NI-DAQmx驱动的正确安装直接决定了后续数据采集的稳定性和功能完整性。不同于普通…...

Phi-3-mini-128k-instruct面试模拟器:基于Java八股文题库的实战应用

Phi-3-mini-128k-instruct面试模拟器:基于Java八股文题库的实战应用 最近跟几个做Java开发的朋友聊天,发现大家都有个共同的烦恼:面试准备太痛苦了。网上的八股文题库动辄几百上千道,自己看吧,枯燥又记不住&#xff1…...

YOLOv11n模型用Ultralytics官方工具转ncnn后,C++推理代码怎么改?附完整修改版

YOLOv11n模型Ultralytics转ncnn后的C推理代码改造指南 当你在移动端部署YOLOv11n模型时,如果采用Ultralytics官方工具导出ncnn格式,会遇到与ncnn官方示例代码不兼容的情况。这种差异主要源于模型输出结构的改变,需要针对性调整C推理代码的逻辑…...

三步掌握Automate Sketch:从入门到精通的高效实战指南

三步掌握Automate Sketch:从入门到精通的高效实战指南 【免费下载链接】Automate-Sketch Make your workflow more efficient. 项目地址: https://gitcode.com/gh_mirrors/au/Automate-Sketch 在现代UI/UX设计工作中,设计师常常面临图层管理繁琐、…...

FaceFusion实战:如何用AI换脸工具制作专属卡通头像?

FaceFusion实战:如何用AI换脸工具制作专属卡通头像? 1. 工具介绍与准备工作 FaceFusion是一款革命性的AI换脸工具,它让普通人也能轻松实现专业级的人脸替换效果。与传统的换脸软件不同,FaceFusion具备以下核心优势: …...

C#/.NET 8实战:利用CommunityToolkit.Mvvm的Messenger打造一个简易实时协作白板

C#/.NET 8实战:构建基于CommunityToolkit.Mvvm的实时协作白板系统 在当今分布式协作日益普及的背景下,实现多用户实时交互的白板工具成为许多应用场景的刚需。本文将带您从零开始,利用.NET 8和WPF框架,结合CommunityToolkit.Mvvm中…...

终端美化神器 Oh-My-Posh:终极跨平台提示符定制解决方案

终端美化神器 Oh-My-Posh:终极跨平台提示符定制解决方案 【免费下载链接】oh-my-posh JanDeDobbeleer/oh-my-posh: Oh My Posh 是一个跨平台的终端定制工具,用于增强 PowerShell、Zsh 和 Fish Shell 等终端的视觉效果,提供丰富的主题和样式来…...