网易互娱后台9.27笔试(2/4)
本人只做出了前2道,上半年(春招)投了没笔试机会,这次给了笔试机会,希望这次也给个面试机会吧😌
第3题输入有点恶心,跳过;第4题样例没过。
1、蛇形方阵-研发(100%)
思路:简单模拟。
#include <bits/stdc++.h>
int map[105][105];
int main() {
int C, n, m, pos, det, tot, i, j;
scanf("%d", &C);
bool flag;
while(C-- > 0) {
scanf("%d%d", &n, &m);
flag = false;
pos = 0;
tot = n * n;
det = 0;
i = j = 0;
while(pos < tot) {
if (!flag) {
// 向右
while (pos < tot && j < n - det) {
map[i][j] = pos++;
j++;
}
j--;
i++;
// 向下
while (pos < tot && i < n - det) {
map[i][j] = pos++;
i++;
}
i--;
j--;
// 向左
while (pos < tot && j >= det) {
map[i][j] = pos++;
j--;
}
// 向上
det++;
i--;
j++;
while (pos < tot && i >= det) {
map[i][j] = pos++;
i--;
}
i++;
j++;
} else {
// 向下
while (pos < tot && i < n - det) {
map[i][j] = pos++;
i++;
}
i--;
j++;
// 向右
while (pos < tot && j < n - det) {
map[i][j] = pos++;
j++;
}
j--;
i--;
// 向上
while (pos < tot && i >= det) {
map[i][j] = pos++;
i--;
}
i++;
j--;
det++;
// 向左
while (pos < tot && j >= det) {
map[i][j] = pos++;
j--;
}
j++;
i++;
}
flag = !flag;
}
while(m-- > 0) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", map[x][y] + 1);
}
}
return 0;
}
2、文件系统-研发(100%)
思路:简单模拟。tle关键点:用一个变量来保存当前没用到的最小非负整数即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
bool vis[maxn];
int main() {
int T, n;
scanf("%d", &T);
char op[10], filename[20];
int fd, newfd;
map<string, int> map1;
map<int, string> map2;
int curIndex;
while(T-- >0) {
map1.clear();
map2.clear();
scanf("%d", &n);
getchar();
curIndex = 0;
memset(vis, false, sizeof(vis));
for(int i = 0; i < n; i++) {
scanf("%s", op);
if(strcmp(op, "open") == 0) {
scanf("%s", filename);
// 非负整数
string name = "";
int len = strlen(filename);
for(int i = 0; i < len; i++) name += filename[i];
for(int i = curIndex; ; i++) {
if(!vis[i]) {
// 直接覆盖
map1[name] = i;
map2[i] = name;
vis[i] = true;
curIndex = i + 1;
break;
}
}
printf("%d\n", map1[name]);
} else if(strcmp(op, "dup2") == 0) {
scanf("%d %d", &fd, &newfd);
// 更改
vis[newfd] = true;
string name = map2[fd];
map1[name] = newfd;
map2[newfd] = name;
} else if(strcmp(op, "dup") == 0){
// dup,重新赋值 fd
scanf("%d", &fd);
string name = map2[fd];
for(int i = curIndex; ; i++) {
if(!vis[i]) {
// 直接覆盖
map1[name] = i;
map2[i] = name;
vis[i] = true;
break;
}
}
printf("%d\n", map1[name]);
} else if(strcmp(op, "close") == 0){
scanf("%d", &fd);
vis[fd] = false;
curIndex = min(fd, curIndex);
map2[fd] = "";
} else {
scanf("%d", &fd);
string name = map2[fd];
int siz = name.length();
for(int i = 0; i < siz; i++) {
filename[i] = name[i];
}
filename[siz] = '\0';
printf("%s\n", filename);
}
}
}
return 0;
}
