奇虎360 技术岗A编程题 -- 内存管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了奇虎360 技术岗A编程题 -- 内存管理相关的知识,希望对你有一定的参考价值。

哎,感觉考试好难啊啊啊啊啊啊!!!!40个选择题+两个编程题。120分钟。那么多读程序的题目。题目都看不完有木有啊!!!!!!!!感觉整个人生都不好了。
题目描述:(具体的也记不清楚了,但是主要内容就是下面的)
模拟内存的分配 释放 和 整理。
操作如下:
new size:分配size字节大小的内存块,返回内存块的句柄handle,size为正整数,如果没有合适的空间返回null。
del handle:释放句柄handle指向的内存块。
def 整理内存碎片。
输入第一行为一个n,m , 分别表示操作次数和内存空间大小。
接下来n行是表示一个操作。
样例:
输入:
6 10
new 5
new 3
del 1
new 6
def
new 6
输出:
1
2
NULL
3
 
  1 #include<iostream>
  2 #include<list>
  3 #include<string>
  4 using namespace std;
  5 struct Memory{
  6     unsigned int value;
  7     unsigned handle ;
  8     bool isuesed;//使用1 没有使用0
  9 };
 10 
 11 void New(list<Memory> &list_memory,unsigned int value,int &handle ){
 12     bool is_success = false;
 13     for (list<Memory>::iterator i = list_memory.begin(); i != list_memory.end(); i++){
 14         if (!(*i).isuesed && (*i).value >= value){
 15             if ((*i).value == value){
 16                 (*i).isuesed = 1;
 17                 (*i).handle = handle++;
 18             }
 19             else{
 20                 Memory m;
 21                 m.handle = handle++;
 22                 m.isuesed = 1;
 23                 m.value = value;
 24                 list_memory.insert(i, m);
 25                 (*i).value -= value;
 26             }
 27             is_success = true;
 28             cout << handle - 1 << endl;
 29             break;
 30         }
 31     }
 32     if (!is_success){
 33         cout << "NULL" << endl;
 34     }
 35 }
 36 
 37 void Def(list<Memory> &list_memory){
 38     int value = 0;
 39     for (list<Memory>::iterator i = list_memory.begin(); i != list_memory.end();){
 40         if (!(*i).isuesed){
 41             value += (*i).value;
 42             (*i).handle = 0;
 43             i = list_memory.erase(i);
 44 
 45         }
 46         else{
 47             i++;
 48         }
 49 
 50     }
 51     if (value){
 52         Memory me;
 53         me.isuesed = 0;
 54         me.value = value;
 55         me.handle = 0;
 56         list_memory.push_back(me);
 57     }
 58 }
 59 
 60 void Delete(list<Memory> &list_memory,unsigned int value){
 61     bool is_success = false;
 62     for (list<Memory>::iterator i = list_memory.begin(); i != list_memory.end(); i++){
 63 
 64         if ((*i).handle == value){
 65             (*i).isuesed = 0;
 66             (*i).handle = 0;
 67             int _del_value;
 68             if (i != list_memory.begin()){
 69                 i--;
 70                 if (!(*i).isuesed){
 71                     
 72                     _del_value = (*i).value;
 73                     i = list_memory.erase(i);
 74                     (*i).value += _del_value;
 75                 }
 76                 else{
 77                     i++;
 78                 }
 79             }
 80             i++;
 81             if (i != list_memory.end() && !(*i).isuesed){
 82                 _del_value = (*i).value;
 83                 i = list_memory.erase(i);
 84                 i--;
 85                 (*i).value += _del_value;
 86             }
 87             is_success = true;
 88             break;
 89         }
 90     }
 91     if (!is_success){
 92         cout << "error" << endl;
 93     }
 94 }
 95 
 96 int main(){
 97     int n, m;
 98     while (cin >> n >> m){
 99         list<Memory> list_memory;
100         Memory me;
101         me.value = m;
102         me.isuesed = 0;
103         me.handle = 0;
104         list_memory.push_back(me);
105         static int handle = 1;
106         for (int l = 0; l < n; l++){
107             string op;
108             unsigned int value;
109             cin >> op;
110             if (op == "new"){
111                 cin >> value;
112                 New(list_memory, value,handle);
113             }
114             else if (op == "def"){
115                 
116                 Def(list_memory);
117             }
118             else if (op == "del"){
119                 cin >> value;
120                 Delete(list_memory, value);
121             }
122 
123             for (list<Memory>::iterator i = list_memory.begin(); i != list_memory.end(); i++){
124                 cout << (*i).value <<   << (*i).isuesed <<   << (*i).handle << endl;
125             }
126             cout << "---------------------分割线-------------------------------------------" << endl;
127         }
128     }
129 }
130  

 

以上是关于奇虎360 技术岗A编程题 -- 内存管理的主要内容,如果未能解决你的问题,请参考以下文章

2016奇虎360研发工程师内推笔试编程题:找镇长

奇虎360PHP工程师2019年面试题和答案解析

奇虎360Java笔试题

面筋: 奇虎360 c++ 后台开发 实习生 面试

360手机一键加速

奇虎360 2017校招笔试题