美团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笔试#
全部评论
最后一个我也18分,猜测是等号可能出现在值中~(所以要取第一个等号之后的拼接作为值)
点赞 回复 分享
发布于 2023-03-25 21:36 上海
最后一题有可能在输入中出现连续多个;嘛?如果有的话在split(;)后可能需要判断一下是不是空,是的话continue
点赞 回复 分享
发布于 2023-03-25 21:44 湖北
相同的key有多个,所以map的value应该是数组,去最后一个
点赞 回复 分享
发布于 2023-03-25 21:53 广东
倒数第二行input().stripe(),去掉空格就能ac
点赞 回复 分享
发布于 2023-03-25 21:54 北京
可以python和c++混合的吗
点赞 回复 分享
发布于 2023-03-31 15:40 香港

相关推荐

过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
某牛奶:一觉醒来全球程序员能力下降200%,小伙成功scanf惊呆在座个人。
点赞 评论 收藏
分享
评论
8
18
分享
牛客网
牛客企业服务