迈普通信笔试 - 8.31
不定项选择:25题 , 编程语法和linux,计算机网络
简答题:2题
- 代码运行的四个阶段
- 给例子判断哪个编程规范更好
编程题:2题
查数组里为2的幂的最大数所在位置
// 因为待处理的数为unsigned int 建立哈希表 存储所有2的幂的数
unordered_set<int> uset;
int FindMaxPowerOf2Element(unsigned int arr[] , unsigned int arrLen){
int num = 2;
while(num < INT_MAX/2){
uset.insert(num);
num *= 2;
}
int res = 0 , idx = -1;
// 遍历查询 最大的2的幂记录idx 如果没有idx = -1 最后返回idx即可
for(int i = 0 ; i < arrlen ; i++){
if(uset.count(arr[i])){
res = max(res , arr[i]);
if(res == arr[i])idx = i;
}
}
return idx;
}
实现两个接口函数分配释放资源
struct ResldNode{
long resld;
int keyA;
int keyB;
};
// 通过一个二维矩阵来判断该资源ID有没有用户占用 , 记录分配ID
vector<vector<int>> id(65536 , vector<int>(65536 , 0));
// 记录用户对应的keyA keyB
unordered_map<int , pair<int , int>> umap;
// 记录每个ID对应的用户数量
unordered_map<int , int> data;
// 记录已经被使用的ID
unordered_set<int> uset;
// 遍历ID值,返回第一个没有被使用的ID
int find_idx(){
for(int i = 1 ; ; i++){
if(!uset.count(i))return i;
}
return -1;
}
long allocResId(int userId , int keyA , int keyB){
long resId = 0;
// 如果该资源没被占用,分配一个ID值,并进行相关记录
if(id[keyA][keyB] == 0){
int cur = find_idx();
uset.insert(cur);
resId = cur;
id[keyA][keyB] = cur;
umap[userId] = make_pair(keyA , keyB);
data[cur] = 1;
}
else{
// 该资源被占用,通过id矩阵得到分配的ID返回,并进行相关记录
int cur = id[keyA][keyB];
resId = cur;
umap[userId] = make_pair(keyA , keyB);
data[cur]++;
}
return resId;
}
/*
1. 首先通过umap用户表获得对应的kayA keyB
2. 通过id矩阵找到分配的对应ID
3. 将该ID的计数--。
如果为0则进行相关的资源删除 打印删除ID值 ;
如果不为0, 相关资源删除,返回OK即可;
*/
int freeeResId(int userId , long resId){
auto it = umap[userId];
int cur = id[it.first][it.second];
data[cur]--;
umap.erase(userId);
if(data[cur]==0){
data.erase(cur);
uset.erase(cur);
cout<<"OK,删除id"<<cur<<endl;
return 1;
}
cout<<"OK,但是id不删除"<<endl;
return 0;
}
查看3道真题和解析