2017校招 360 笔试题 编程题 内存管理

2023-11-17

内存管理 
时间限制:C/C++语言 1000MS;其他语言 3000MS 
内存限制:C/C++语言 65536KB;其他语言 589824KB 
题目描述: 
物联网技术的蓬勃发展,各种传感器纷纷出现。小B所在的项目组正在开发一个物联网项目,她们在研究设计一种新的传感器。这种传感器有自己的基本处理单元,具有一定的自主性,能够进行简单的数据收集、处理、存储和传输。为降低系统功耗并保证系统可靠性和可控性,他们要对内存进行基本的管理。研究小组计划开发一个实验性内存管理器,实现对内存的分配、释放和整理。对应的接口为new、del和def,使用语法为: 
new size:分配size字节大小的内存块,返回该内存块的句柄handle,size为正整数; 
del handle:释放句柄handle指向的内存块; 
def:整理内存碎片,将所有已分配内存块按地址从低到高的顺序迁移,使空闲内存碎片在高地址端拼接在一起; 
初始内存为 initSize 字节大小的整片空闲内存,编号为 1 到 initSize 。 
new size操作中,若存在不小于size的连续空闲内存,则按照小地址优先的原则从空闲内存区域中分配size大小的内存块,标记该内存块状态为已分配,并返回指向该内存块的句柄。若无法分配,则返回空(NULL)。 
del handle操作释放由handle标记的内存块,标记被释放的内存状态为空闲。若handle为无效句柄,则返回ILLEGAL_OPERATION。 
def 完成内存整理工作,无返回值。 
根据设计,每次成功内存分配返回的句柄为一个正整数,从1开始,依次计数。失败的存储分配操作不影响计数。 
项目小组将此项任务分配给小B,小B向你求助,你能帮她吗? 
输入 
输入中有多组测试数据。每组测试数据的第一行为两个正整数T和MaxMem(1<=T<=10000, 1<=MaxMem<=10000),其中T为操作次数,MaxMem为初始内存大小,随后有T行操作指令。 
输出 
对每组测试数据,按操作顺序输出操作结果。对每个new操作,在单独行中输出结果,成功时输出其返回句柄值,失败则输出NULL。若del操作失败,输出ILLEGAL_OPERATION。def不产生输出。

样例输入 
6 10 
new 5 
new 3 
del 1 
new 6 
def 
new 6 
样例输出 


NULL 
3

Java实现的代码如下:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * 
 * @author fangzheng
 * @date 2016-09-10
 * 
 * 360笔试题:动态内存管理
 *
 */
public class MemoryManager {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		while (scan.hasNext()) {
			//也可以移出去将输入多个案例作为整体
			LinkedList<Block> blocksList = new LinkedList<>();
			int blockId = 0;
			
			int m = scan.nextInt();
			int maxSize = scan.nextInt();

			StringBuffer buffer = new StringBuffer();

			for (int i = 0; i < m; i++) {
				String input = scan.next();
				if (input.equals("new")) {
					// 分配内存
					String res = allocatMemory(blockId + 1, scan.nextInt(), maxSize,
							blocksList);
					if (!res.equals("NULL")) {
						blockId++;
					}
					buffer.append(res).append("\n");
				} else if (input.equals("del")) {
					// 删除已分配内存
					String res =releaseMemory(scan.nextInt(), blocksList);
					buffer.append(res).append("\n");

				} else if (input.equals("def")) {
					// 整理内存,将占用内存向低地址移动
					arrangeMemory(blocksList);
				}
			}
			System.out.println(buffer.toString());
		}
		scan.close();
	}

	/**
	 * 整理内存,将占用的内存从高地址转移低地址
	 * @param list
	 */
	private static void arrangeMemory(LinkedList<Block> list) {
		if (list == null || list.isEmpty()) {
			return;
		}

		//System.out.println("内存整理前:" + list);
		Iterator<Block> iterator = list.iterator();
		while (iterator.hasNext()) {
			Block block = iterator.next();
			if (block.isFree) {
				iterator.remove();
			}
		}
		//System.out.println("内存整理后:" + list);
	}

	/**
	 * 释放内存
	 * 
	 * @param id
	 * @param list
	 * @return
	 */
	private static String releaseMemory(int id, LinkedList<Block> list) {
		boolean hasRelease = false;
		
		for (Block block : list) {
			if (block.id == id) {
				block.isFree = true;
				hasRelease = true;
				break;
			}
		}
		return hasRelease ? "" : "ILLEAG_OPERATION";
	}

	/**
	 * 分配内存
	 * 
	 * @param id
	 * @param needSize
	 * @param maxSize
	 * @param list
	 * @return
	 */
	private static String allocatMemory(int id, int needSize, int maxSize,
			LinkedList<Block> list) {
		if (needSize <= 0 || needSize > maxSize) {
			return "NULL";
		}

		int temp = 0;
		int sumSize = 0;
		int i = 0;
		int defaultId = 0;
		for (; i < list.size(); i++) {
			Block block = list.get(i);
			if (block.isFree && block.size >= needSize) {
				temp = block.size - needSize;
				block.size = needSize;
				block.isFree = false;
				defaultId = block.id;
				block.id = id;
				break;
			}
			sumSize += block.size;
		}

		if (i < list.size()) {
			if (temp > 0) {
				// 在上面的Block后面连接上大小位temp的block
				Block otherBlock = new Block(defaultId, temp, false);
				list.add(i, otherBlock);
			}
		} else if (needSize <= maxSize - sumSize) {
			Block block = new Block(id, needSize, false);
			list.add(i, block);
		} else {
			return "NULL";
		}
		return id + "";
	}
}

class Block {
	int id;//分配的内存块序号
	int size;//分配大小
	boolean isFree;//内存块状态

	public Block(int id, int size, boolean isFree) {
		this.id = id;
		this.size = size;
		this.isFree = isFree;
	}

	@Override
	public String toString() {
		return "Block [id=" + id + ", size=" + size + ", isFree=" + isFree
				+ "]";
	}

}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2017校招 360 笔试题 编程题 内存管理 的相关文章

  • RT-Thread记录(八、理解 RT-Thread 内存管理)

    RT Thread内核的我们已经基本都学习过了 除了基本的线程操作和通信 内核部分还有内存管理和中断处理 本文主要就来说说内存管理相关问题 目录 前言 一 为什么要内存管理 二 RT Thread 内存堆管理 2 1 RT Thread 内
  • 操作系统内存管理及虚拟内存技术

    一 内存管理 操作系统的内存管理主要负责内存的分配与回收 malloc 函数 申请内存 free 函数 释放内存 另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情 1 常见的内存管理机制 1 1 连续分配管
  • linux内存管理

    原文链接 https blog csdn net wwwlyj123321 article details 128241134 一 内存管理简述 在Linux内核中 RAM会将其中一部分永远分配给内核 用来存放Linux内核源码以及一些静态
  • 内核管理-之进程虚拟内存-基于linux3.10

    关于启动过程内存管理见 内存管理 之启动 关于内核空间内存管理见 内存管理 之内核内存管理 如果需要 内存管理五章整理成pdf了 下载地址http download csdn net detail shichaog 8662135 进程的虚
  • 了解实现一个高并发的内存池——TLS Memmory Pool

    为什么需要内存池 1 效率问题 如果我们直接向系统申请内存 当我们需要频繁的申请释放内存时 就需要频繁的与系统层产生交互 多次切换用户态和内核态 而用户态和内核态之间的切换的消耗是非常大的 因此申请内存的消耗就会很大 程序效率也就随之降低了
  • 虚拟化一、虚拟化技术基础原理

    一 虚拟化 虚拟化 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 在一台计算机上同时运行多个逻辑计算机 每个逻辑计算机可运行不同的操作系统 并且应用程序都可以在相互独立的空间内运行而互不影响 从而显著提高计算机的工作效率 虚拟化使用软
  • 2019年中山大学数据科学与计算机学院研究生统考机试

    2019年中山大学数据科学与计算机学院研究生统考机试题目回忆 本文回忆了2019年中山大学数据科学与计算机学院研究生考试机试题目 希望能对以后的同学的学习有所帮助 机试共十道题 1 继承 一共有3个类 animal cat dog cat和
  • 一文读懂 PyTorch 显存管理机制

    点击上方 视学算法 选择加 星标 或 置顶 重磅干货 第一时间送达 作者丨米阿罗 知乎 已授权 来源丨https zhuanlan zhihu com p 486360176 编辑丨极市平台 首发于踢翻炼丹炉 https www zhihu
  • 2017今日头条网招在线编程题(部分)

    第一题 P 为 给 定 的 二 维 平 面 整 数 点 集 定 义 P 中 某 点 如 果 满 足 P 中 任 意 点 都 不 在 的 右 上 方 区 域 内 横 纵 坐标 都 大 于 则 称 其 为 最 大 的 求 出 所 有 最 大 的
  • 嵌入式100题(86):简述处理器在读内存的过程中,CPU核、cache、MMU如何协同工作?画出CPU核、cache、MMU、内存之间的关系示意图加以说明...

    简述处理器在读内存的过程中 CPU核 cache MMU如何协同工作 画出CPU核 cache MMU 内存之间的关系示意图加以说明 现代操作系统普遍采用虚拟内存管理机制 这需要MMU Memory Management Unit 内存管理
  • Spark内存管理-UnifiedMemoryManager和StaticMemoryManager

    在Spark 1 6 0中 引入了一个新的参数spark memory userLegacyMode 默认值为false 表示不使用Spark 1 6 0之前的内存管理机制 而是使用1 6 0中引入的动态内存分配这一概念 从SparkEnv
  • 连续子序列最大最小值差额最大化

    本文为最近做过的一道编程笔试题 代码实现方式多种多样 此处本人提供的代码可以获得正确解 仅供大家参考 目录 一 题目描述 二 实现代码程序 三 测试结果截图 一 题目描述 题目描述 Mike在一家律师事务所工作 他的老板Harvey分配给他
  • java实现:《操作系统实验三》模拟内存管理

    固定分区分配 固定分区分配是最简单的一种多道程序存储管理方式 它将用户内存空间划分为若干个固定大小的区域 每个分区只装入一道作业 当有空闲分区时 便可以再从外存的后背作业队列中 选择适当大小的作业装入该分区 如此循环 优缺点 分区大小相等
  • 内存管理之一__align字节对齐

    转 http www cnblogs com ye moooooo p 4601189 html 一 什么是字节对齐 为什么要对齐 现代计算机中内存空间都是按照byte划分的 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始 但实际情
  • 服务器的tomcat调优和jvm调化

    下面讲述的是tomcat的优化 及jvm的优化 Tomcat 的缺省配置是不能稳定长期运行的 也就是不适合生产环境 它会死机 让你不断重新启动 甚至在午夜时分唤醒你 对于操作系统优化来说 是尽可能的增大可使用的内存容量 提高CPU 的频率
  • Qt内存管理(三) Qt的智能指针

    智能指针则可以在退出作用域时 不管是正常流程离开或是因异常离开 总调用delete来析构在堆上动态分配的对象 Qt常用的智能指针有QPointer QScopedPointer QSharedPointer 关于这几个智能指针 网上的博客基
  • 进程间通信之共享内存分析

    零拷贝技术 https strikefreedom top linux io and zero copy 一 内存映射和共享内存的区别 1 1 内存映射之mmap函数 将一个文件或者其它对象映射到进程的地址空间 实现文件磁盘地址和进程虚拟地
  • 内存管理方案

    内存管理方案 Memory Management System Author Owen 目 录 内存管理方案 1 目 录 1 1 概述 2 2 理论依据 2 2 1 不对内存进行管理 2 2 2 对内存进行内部管理 2 3 实现方案 2 3
  • 【数据结构】堆、栈的区别

    heap 是堆 stack 是栈 在编程语言中 内存分配方式主要包括 栈 堆 静态存储分配 栈的内存是由操作系统自动分配 释放的 存放函数的参数值 局部变量等 堆的内存是由程序员手动申请和释放的 对应C语言中的malloc函数和C 中的ne
  • RT-Thread 内存管理

    在计算机系统中 通常存储空间可以分为两种 内部存储空间和外部存储空间 内部存储空间通常访问速度比较快 能够按照变量地址随机访问 也就是我们通常所说的RAM 随机存储器 可以把它理解为电脑的内存 而外部存储空间内所保存的内容相对来说比较固定

随机推荐

  • CHROME扩展开发之·消息传递Message(window.message)

    由于content scripts运行在Web页面的上下文中 属于Web页面的组成部分 而不是Google Chrome扩展程序 但是content scripts又往往需要与Google Chrome扩展程序的其他部分通信以共享数据 这可
  • 小红书流量逻辑、KOL模型、内容营销

    小红书平台专项课 品牌营销训练营 融合了千瓜历年研究和整理的成果 结合实际案例给到大家最全最干货的内容 本文选取了课程中的精华部分 为大家提供一份历年品牌营销投放的实操总结 助力2022年品牌营销增长 从消费者层级到消费者决策 从品牌内容营
  • 【Transformer学习笔记】VIT解析

    很久以前科学家做过一个生物实验 发现视觉神经元同样可以被训练来作听觉神经元之用 受此启发 不少计算机研究者也在寻找着机器学习领域的大一统 将CV任务和NLP任务使用相同或者类似的结构进行建模 随着transformer在nlp领域已经杀出了
  • 微信小程序使用本地图片在真机预览不显示的问题解决

    开发工具上本地图片可以显示 但是在真机上预览的时候不能显示 通常我们代码路径是代码是这样写的
  • 什么是 Python?Python 基础编程入门指南,带你从零开始深入了解

    Python是当今最流行的编程语言之一 Python以其简单的语法和多功能性而闻名 既易于学习又可用于高级应用程序 可以使用Python的领域也非常广泛 人工智能 机器学习 Web 开发 基本上绝大多数热门的域都能看到Python的身影 今
  • MODBUS CRC校验原理及C语言实现

    MODBUS通信协议的CRC校验原理多项式为8005的逆序A001 列01的CRC校验原理 1111111111111111 初始化CRC寄存机 0000000000000001 1111111111111110 异或 0111111111
  • pread介绍

    1 先来介绍pread函数 root bogon mycode cat test c include
  • QT中的事件

    目录 1 QT事件 1 1 事件介绍 1 2 事件的处理 2 键盘事件 2 1 keyPressEvent 2 1 1 判断某个键按下 2 1 2 组合键操作 3 鼠标事件 3 1 鼠标单击事件 3 2 鼠标释放事件 3 3 鼠标双击事件
  • vim 常用命令

    文本替换 s 替换 g global 全部 如果不加g则只会替换每行第一个word1 1 20s hello helloworld g 将1 20行中的 hello 替换为 helloworld 统计字符串出现次数 s pattern gn
  • innerHTML 用法

    用法 比如在中写了如下的代码 div div 现在用top innerHTML 的方法就可以向这个id的位置写入HTML代码了 例如top innerHTML
  • 啊哈c语言 潦草的初步笔记(3)

    第四章 while 当while后面 中的关系表达式为真时 即成立时才执行 种的内容 读作 mod 也称作 取模 作用是获取余数 的左右两边必须是整数 表示除号 作用是获取商 的左右两边可以是整数也可以是小数 等待 语句 Sleep 注意S
  • 20. 异常处理

    Hi 大家好 我是茶桁 在我们日常使用Python或者其他编程语言的时候 不可避免的都会出现报错和异常 那么 我们今天就来谈谈异常 什么是异常 异常异常 根据名字简单理解 那就是非正常 也就是没有达到预期目标 异常呢 其实就是一个事件 并且
  • CAP原理的证明

    CAP概述 C Consistency 一致性 A Availability 可用性 P Partition Tolerance分区容错性 CAP理论的核心是 一个分布式系统不可能同时很好的满足一致性 可用性和分区容错性这三个需求 最多只能
  • 【业务功能118】微服务-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及应用

    OpenELB部署及应用 一 OpenELB介绍 网址 openelb io OpenELB 是一个开源的云原生负载均衡器实现 可以在基于裸金属服务器 边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 S
  • jquery子窗体操作父窗体中的元素

    1 在父窗口中操作子窗口中的元素 如 其中 iframe1是iframe的ID 1 选中IFRAME中的所有单选钮 window frames iframe1 document find input type radio attr chec
  • 华为云云耀云服务器L实例评测|云耀云服务器L实例部署paperless-ngx文档管理系统

    华为云云耀云服务器L实例评测 云耀云服务器L实例部署paperless ngx文档管理系统 一 云耀云服务器L实例介绍 1 1 云耀云服务器L实例简介 1 2 云耀云服务器L实例特点 二 paperless ngx介绍 2 1 paperl
  • SWAPIDC服务器销售模板,记录利用swapidc搭建IDC销售网站教程

    现在免空泛滥 所以写这么一篇教程吧 一 准备工作 首先你要准备一台服务器 其中推荐使用国外的Vultr 系统使用Centos6 方便实验 也可以用我的IDC服务器 不推荐使用国内的 因为域名需要备案 容易引起访问错误 使用SSH登陆服务器后
  • CA6140数控化改装设计(论文+CAD图纸)

    摘要 随着我国工业生产的发展 机械工业即将面临着一个十分重要的课题 设备改造 本设计就是对CA6140车床的机械部分 进行数控改造 数控改造主要是简化机械传动机构 缩短传动链 提高自动化程度 也是为了解决复杂的零件加工 精度控制及提高产品质
  • [从零开始学DeepFaceLab-15]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - 打开Windows的GPU加速开关

    目录 前言 第1章 来自DeepFaceLab模型训练的提醒 第2章 打开该开关的意义
  • 2017校招 360 笔试题 编程题 内存管理

    内存管理 时间限制 C C 语言 1000MS 其他语言 3000MS 内存限制 C C 语言 65536KB 其他语言 589824KB 题目描述 物联网技术的蓬勃发展 各种传感器纷纷出现 小B所在的项目组正在开发一个物联网项目 她们在研