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 笔试题 编程题 内存管理 的相关文章

  • 2014阿里巴巴9月15哈尔滨校园招聘笔试题及答案

    from http blog csdn net lingfengtengfei article details 12344711
  • java启动jar包修改JVM默认内存

    JVM默认物理内存 JVM初始分配的内存由 Xms指定 默认是物理内存的1 64 JVM最大分配的内存由 Xmx指定 默认是物理内存的1 4 默认空余堆内存小于40 时 JVM就会增大堆直到 Xmx的最大限制 空余堆内存大于70 时 JVM
  • 内核管理-之进程虚拟内存-基于linux3.10

    关于启动过程内存管理见 内存管理 之启动 关于内核空间内存管理见 内存管理 之内核内存管理 如果需要 内存管理五章整理成pdf了 下载地址http download csdn net detail shichaog 8662135 进程的虚
  • 50道编程小题目之【分解质因数】

    题目 将一个正整数分解质因数 例如 输入90 打印出90 233 5 python解题代码 ii int input 请输入一个正整数 jj 2 ii b ii fj while jj lt ii if ii jj 0 if ii jj f
  • C++11 谈谈shared_ptr

    C 11 谈谈shared ptr 细节 个人用 十分主观 仅供参考 shared ptr是C 11中加入的一种智能指针 其实并不够智能 其作用就是帮助我们管理在堆中开辟的空间 避免野指针等众多内存管理不当造成的问题 重点 智能指针会自动的
  • malloc底层原理实现

    使用过c语言的都知道malloc是一个动态分配内存的函数 还可以通过free释放内存空间 如果我们想分析一下malloc的源码 这其实不是一会就能看懂的 但是我们可以讨论一下malloc的简单实现 在这之前 我们先来看一下虚拟内存空间 虚拟
  • 内核杂谈——页表项存放的是物理地址还是虚拟地址?

    目录 L0 L1 L2 表项 L3 表项 总结 pgd t 不只是物理地址 谈谈对映射的理解 思考 当你不去细细读代码的话 这个问题可能会困扰着你 我们以ARM64四级页表为例 谈谈页表项里藏得是什么 本文讨论的是内核线性映射过程时建立的临
  • 代码审查总结

    近期所带项目 由于人员素养良莠不齐 写出的代码质量不一 为了保证项目质量 不得不正确代码一行行进行审查 同一时候 为了对代码审查有个更深的了解及借鉴其他同行实践成果 在网上搜集了不少项目知识 以下是对这些知识做出的整理 第1章前提 在 Wi
  • 虚拟化一、虚拟化技术基础原理

    一 虚拟化 虚拟化 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 在一台计算机上同时运行多个逻辑计算机 每个逻辑计算机可运行不同的操作系统 并且应用程序都可以在相互独立的空间内运行而互不影响 从而显著提高计算机的工作效率 虚拟化使用软
  • 从malloc中窥探Linux内存分配策略

    malloc函数是C C 中常用内存分配库函数 本篇文章将以Linux平台上的malloc为剖析对象 深入了解分配一块内存的旅程 malloc入门 使用malloc 需要包含头文件 stdlib h 函数原型如下 extern void m
  • Spark内存管理-UnifiedMemoryManager和StaticMemoryManager

    在Spark 1 6 0中 引入了一个新的参数spark memory userLegacyMode 默认值为false 表示不使用Spark 1 6 0之前的内存管理机制 而是使用1 6 0中引入的动态内存分配这一概念 从SparkEnv
  • Qt内存管理(五) 自动垃圾回收机制

    实现自动垃圾回收的工具主要是Qt对象清理器 也就是QObjectCleanupHandler类 它监视多个QObject对象的生命期 当你想知道被别人拥有的QObject对象是否被删除时 这个类就派上了用场 例如引用 referencing
  • C++从入门到放弃之:C++ 左值引用与右值引用详解

    C 从入门到放弃 C 引用 1 左值引用 2 万能引用 常引用 3 右值引用 4 引用型函数返回值 5 引用和指针 6 函数传参传递指针和引用的区别 总结 C 引用 1 左值引用 定义 引用即别名 某个变量的别名 对引用的操作就等同于对变量
  • linux 调试技术

    本文讨论了四种调试Linux程序的情况 在第1种情况中 我们使用了两个有内存分配问题的样本程序 使用MEMWATCH和 Yet AnotherMallocDebugger YAMD 工具来调试它们 在第2种情况中 我们使用了Linux中的s
  • CE+OD外挂制作实战 [提高篇]

    人造指针 基址 实验目标 通过向游戏注入一段特殊汇编代码 实现自动获取动态地址 省略找基址的麻烦 为什么会出现人造指针 1 基址偏移层数太多 很难找 2 有些游戏根本找不到基址 人造指针有什么优缺点 1 人造指针就算游戏更新也无需去重复找基
  • 慢慢欣赏linux pud_offset解析

    typedef struct pudval t pud pud t gt typedef u64 pudval t dir表示L0页表索引的指针 指向PUD页表的基地址 define pud offset dir addr pud t va
  • 2048游戏矩阵操作算法

    题目 1 手指向一个方向滑动 所有格子会向那个方向运动 2 相同数字的两个格子 相撞时数字会相加 输入描述 1 输入为一个3 3的矩阵 2 接下来输入一个1 4的数字 1表示向上滑动 2表示向下划动 3表示向左滑动 4表示向右滑动 输出描述
  • 【PAT】B1032 挖掘机技术哪家强 (20 分)_C语言实现

    1 挖掘机技术哪家强 20 分 为了用事实说明挖掘机技术到底哪家强 P A T PAT PAT 组织了一场挖掘机技能大赛 现请你根据比赛结果统计出技术最强的那个学校 输入格式 输入在第 1
  • ​LeetCode解法汇总83. 删除排序链表中的重复元素

    目录链接 力扣编程题 解法汇总 分享 记录 CSDN博客 GitHub同步刷题项目 https github com September26 java algorithms 原题链接 力扣 LeetCode 描述 给定一个已排序的链表的头
  • ​LeetCode解法汇总82. 删除排序链表中的重复元素 II

    目录链接 力扣编程题 解法汇总 分享 记录 CSDN博客 GitHub同步刷题项目 https github com September26 java algorithms 原题链接 力扣 LeetCode 描述 给定一个已排序的链表的头

随机推荐

  • 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所在的项目组正在开发一个物联网项目 她们在研