美的笔试总结(软件开发,楼主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;
}


查看1道真题和解析