美团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 香港

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
我即大橘:耐泡王
点赞 评论 收藏
分享
8 18 评论
分享
牛客网
牛客企业服务