美团3月25日笔试题目回忆
下面题目内容是根据回忆所写。
第一题:
给出一个数字1-n的入栈顺序in[]和出栈顺序out[],问这个出入栈顺序是不是合法的。
example
in:1 2 3
out: 1 2 3
合法,每个元素入栈之后立刻出栈即可
example
in: 1 2 3
out 3 2 1
合法,全部入栈之后再全部出栈
example
in: 1 2 3
out: 3 1 2
不合法。
思路:用一个stack按顺序入栈,同时维护一个指针ptr_out表明按照题目的给出的out数组下一个应该出栈的是哪个元素。按顺序讲in元素入栈,然后如果当前栈顶元素和out[ptr_out]是同一个,那么就将栈顶弹出,同时ptr_out++,直到栈顶和ptr_out指向的原素不同为止。按照这个操作,如果最后能把所有元素都弹出栈并且ptr_out走完了out数组,那么就是是合法的,否则非法。
#include <iostream>
#include <stack>
using namespace std;
int in[50050];
int out[50050];
stack<int> s;
int main() {
int t;
int n;
cin >> t;
while (t --) {
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> in[i];
}
for (int i = 0; i < n; i ++) {
cin >> out[i];
}
int po = 0;
for (int i = 0; i < n; i ++) {
s.push(in[i]);
while (!s.empty() && s.top() == out[po]) {
s.pop();
po ++;
}
}
if (s.empty() && po == n) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
while (!s.empty()) s.pop();
}
string s;
s.
}
第二题:
给出一列数,从中选取若干个,要求所选的任意两个数字的位置至少隔开2个位置,也就是选取了i的话,i-2,i-1,i+1, i+2都不能选。
思路:简单的dp题,用f[i]表示选取只考虑前i项时的最优解是多少。转移方程如下。
f[i] = max(f[i-2], f[i-1], f[i-3] + a[i]);
第三题:
给出一堆巧克力的边长,巧克力的重量是边长的平方。给出若干个询问q,问在重量不超过q的前提下,最多能选多少块巧克力。
思路:贪心,先选小的再选大,因为如果存在一个选择大巧克力的方案的话,必然可以把大巧克力换成比他更小的巧克力达到同样优的解。然后注意题目并不保证给出的巧克力是从小到大的顺序,也不保证询问q是从小到大。于是我们先把巧克力的重量排个序,然后算一下前缀和,之后可以对每个询问做二分查询在线处理,也可以先接受所有的询问,把询问从小到大离线处理。
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
long long a[50050];
long long s[50050];
long long q;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++) {
cin >> a[i];
}
sort(a, a + n);
s[0] = a[0] * a[0];
for (int i = 1; i < n; i ++) {
s[i] = s[i - 1] + a[i] * a[i];
}
while (m --) {
cin >> q;
if (q < s[0]) {
cout << 0 << ' ';
} else {
int l = 0;
int r = n;
while (l + 1 < r) {
int mid = (l + r) / 2;
if (q >= s[mid]) {
l = mid;
} else {
r = mid;
}
}
cout << l + 1 << ' ';
}
}
}
第四题:
给出一串字符串,形如“key1=val1;key2=val2;key3=val;”,然后给出q个询问,每个询问是一个字符串s,如果s有对应的key,则输出对应的value,如果有多个key对应,则按照最后出现的那一组key value来输出,如果没有对应的则输出“EMPTY”。
思路:字符串处理一下然后使用map或者dict就可以。我不知道我的代码哪里有点问题,只过了18%,有看出来的朋友可以指点我一下吗,谢谢
s = input()
n = input()
if s[-1] == ";":
s = s[:-1]
pairs = s.split(";")
mapping = {}
for i in range(len(pairs)):
kv = pairs[i].split("=")
if len(kv) > 1:
mapping[kv[0]] = kv[1]
for i in range(int(n)):
q = input()
print(mapping.get(q, "EMPTY"))
#美团3.25笔试#