题目描述
动态内存管理根据用户的需求分配任意大小的内存,当用户释放内存时,被释放的内存回到池(堆)中供其他用户使用。现设计某实时操作系统计划的内存管理功能,请你实现被释放内存的回收合并模块,当经过一次内存释放操作后,请返回当前最大的连续内存块的起始位置,以及此连续内存的数量(块数)。若存在多个最大连续内存块,则返回编号最小的内存块信息。当前已经把连续内存,按块进行连续编号。
解答要求
时间限制:C/C++1000ms,其他语言:2000ms 内存限制:C/C++256MB其他语言:512MB
输入
1,3,2,5
表示释放四块内存,ID分别为1.3.2.5,每块内存的大小为1个单位[预制条件];
函数执行前,所有内存均已被申请完毕,无空闲,不需考虑内存重复释放[取值范围];
内存ID编号:0<ID<2^31-1,单次释放的内存个数<10000
输出
1,3
经过回收处理后,当前可用的最大连续内存大小3,以及此内存的起始编号1。
说明:1,3,2,5四块内存,前面三块1,3,2为连续内存,合并后的连续内存数为3个单位起始编号为1,因此返回1,3
- 样例1
输入:1,3,2,5
输出:1,3
解释:1,3,2,5四块内存,前面三块1,3,2为连续内存,合并后的连续内存数为3个单位。起始编号为1,因此返回1,3- 样例2
输入:2,4,3,7,6
输出:2,3
解释:2,4,3,7,6,表示释放了5块内存,内存块编号分别为2、4、3、7、6。
经过回收合并后,2、3、4三块内存连续,可以合并为一块大内存,大小为3个单位
6、7两块内存连续,合井后的连续内存大小为2。
因此返回此时的最大连续内存的起始位置为2,内存大小为3
代码
#include<iostream>
#include<vector>
#include<string>
#include<sstream> //stringstream函数头文件
#include<algorithm> //sort函数头文件
using namespace std;
class Solution{
public:
void find(vector<int>& v){
int index = 0;
int n = v.size();
int start=-1, max_len=-1;
while(index < n){
int i = index;
for(int j=index+1; j<n; j++){
if(v[j]-v[i] != 1) break; //break跳到循环体外 继续向下执行
i++;
}
if(max_len < i-index+1){
max_len = i-index+1;
start = index;
}
index = i+1;
}
cout<<v[start]<<","<<max_len<<endl;
}
};
int main(){
//输入并放到vector数据结构
string s;
getline(cin, s);
for(int i=0; i<s.size(); i++){ //将输入字符中间的逗号符转换为空格符
if(s[i] == ','){
s[i] = ' ';
}
}
stringstream iss(s); //iss处理字符中间是空格或者tab
vector<int> v;
int num;
while(iss>>num){
v.push_back(num);
}
// cout<<"before sort"<<endl;
// for(auto &i:v){ //与 for(int i=0;i<v.size();i++)等价
// cout<<i<<" ";
// }
// cout<<endl;
//对数组v排序
sort(v.begin(), v.end());
Solution solu;
solu.find(v); //寻找最大连续内存的起点及长度
}