本人只做出了前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; }
全部评论
(8) 回帖