美的笔试总结(软件开发,楼主cpp)
选择题有单选和多选,多选注意少选不得分。主要考察c++的相关理解,如智能指针,多态特性,新特性如auto,还有死锁的条件等。
编程题两道
第一道,搜金币,注意每次只能向右边或者向下,方向数组大小为2。
#include <functional> #include <iostream> using namespace std; int map[1002][1002]; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &map[i][j]); } } int dx[4] = {1, 0}; int dy[4] = {0, 1}; long long ans = 0; function<void(int, int, long long)> search_map = [&](int i, int j, long long coins) { if (i < 1 || i > n || j < 1 || j > n || map[i][j] == -1) { ans = max(ans, coins); return; } int temp = map[i][j]; coins += temp; map[i][j] = -1; for (int k = 0; k < 2; k++) { search_map(i + dx[k], j + dy[k], coins); } coins -= temp; map[i][j] = temp; return; }; search_map(1, 1, 0); cout << ans << endl; return 0; }
第二道 一个表头为 head 的单向链表, 链表每个节点里面存储了一个随机数,对于链表中任意三个相邻的节点,如果前两个节点的和等于第三个节点,我们认为该链表不够随机。为了去除这种不符合要求的数据,我们需要删除这三个节点中的中间那个节点。 个人思路 使用两个deque 其中一个作为窗口使用 不断读入数字 当窗口大小为3时开始判断 符合要求时 将队首弹出到辅助deque中 不符合要求时 在取回来继续判断即可。
#include <iostream> #include <queue> #include <stack> using namespace std; int main() { int temp = 0; deque<int> window; //用来保存window窗口塞满时的队首元素 deque<int> prewindow; while (scanf("%d", &temp) != EOF) { window.push_back(temp); while (window.size() == 3) { if (window[0] + window[1] == window[2]) { // 记住此时的队首元素 int front = window.front(); // 记住此时的队尾元素 int back = window.back(); if (!prewindow.empty()) { int help_back = prewindow.front(); prewindow.pop_front(); window.clear(); window.push_back(help_back); window.push_back(front); window.push_back(back); } else { window.pop_back(); window.pop_back(); window.push_back(back); } } else { int front = window.front(); window.pop_front(); prewindow.push_back(front); } } } vector<int> ans; for (int i = 0; i < prewindow.size(); i++) { printf("%d ", prewindow[i]); } for (int i = 0; i < window.size(); i++) { printf("%d ", window[i]); } return 0; }