美团笔试统计&题解 2022-08-06 后端&数开&软开

1.包装礼盒
2.划分数组
3.反转朝上数字个数大于一半
4.训练集测试集划分
5.拼接字符串中的第k个字符


1.如果少的部分能拿完,答案就是少的那部分,否则就是两者之和除以3,因为你可以让多的那部分逼近少的,然后两者再交替拿。
#include <bits/stdc++.h>
using namespace std;

int fun(int x, int y) {
    if(x == 0 || y == 0) return 0;
    if(x == 1 && y == 1) return 0;
    if(x > y) swap(x, y);
    int z = y / 2;
    if(z >= x) {
        return x;
    } else {
        return (x + y) / 3;
    }
}

int main() {

    int T;
    cin >> T;
    while(T--) {
        int x, y;
        cin >> x >> y;
        cout << fun(x, y) << endl;
    }

    return 0;
}
2.前缀和、后缀和
#include <bits/stdc++.h>
using namespace std;

int a[100005];
int b[100005];
int c[100005];

int main() {

    int n;
    cin >> n;
    b[0] = c[n] = 0;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        if(a[i] >= 0) {
            b[i + 1] = b[i] + 1; 
        } else {
            b[i + 1] = b[i];
        }
    }
    for(int i = n - 1; i >= 0; i--) {
        if(a[i] <= 0) {
            c[i] = c[i + 1] + 1;
        } else {
            c[i] = c[i + 1];
        }
    }
    int ans = c[0];
    for(int i = 0; i < n; i++) {
        ans = min(ans, b[i + 1] + c[i + 1]);
    }
    cout << ans << endl;


    return 0;

}
3.记录反面每个数出现的个数,即反转后是该数的个数,然后遍历正面每个数的情况并统计,特殊情况是,正面的数都不满足,就得再看看反面的
#include <bits/stdc++.h>
using namespace std;

int a[100005];
int b[100005];

int main() {

    int n;
    cin >> n;
    unordered_map<int, int>mp;//记录反转后是x的数个数
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for(int i = 0; i < n; i++) {
        cin >> b[i];
        if(b[i] != a[i]) {
            mp[b[i]]++;
        }
    }
    int target;
    if(n & 1) target = n / 2 + 1;
    else target = n / 2;
    sort(a, a + n);
    int ans = INT_MAX;
    for(int i = 0; i < n; i++) {
        int count = 0;
        int j = i;
        while(j < n && a[i] == a[j]) {
            count++;
            j++;
        }
        if(count >= target) {
            ans = 0;
            break;
        }
        if(mp[a[i]] >= target - count) {
            ans = min(ans, target - count);
        }
        i = j - 1;
    }
    if(ans != INT_MAX) cout << ans << endl;
    else {
        for(int i = 0; i < n; i++) {//正面的数字都不能满足要求,就只能看看能不能反转target个反面的数字
            if(mp[b[i]] >= target) {
                ans = target;
                break;
            }
        }
        if(ans != INT_MAX) cout << ans << endl;
        else cout << -1 << endl;

    }



    return 0;
}
4.排序
#include <bits/stdc++.h>
using namespace std;

int a[10005];

int main() {

    int n, k;
    cin >> n >> k;
    vector<vector<int>>v(k);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        v[a[i] - 1].push_back(i + 1);
    }
    vector<int>train;
    vector<int>test;
    for(int i = 0; i < k; i++) {
        int m = ceil(1.0 * v[i].size() / 2);
        for(int j = 0; j < m; j++) {
            train.push_back(v[i][j]);
        }
        for(int j = m; j < v[i].size(); j++) {
            test.push_back(v[i][j]);
        }
    }
    sort(train.begin(), train.end());
    sort(test.begin(), test.end());
    for(int i = 0; i < train.size(); i++) {
        if(i == train.size() - 1) cout << train[i] << endl;
        else cout << train[i] << " ";
    }

    for(int i = 0; i < test.size(); i++) {
        if(i == test.size() - 1) cout << test[i] << endl;
        else cout << test[i] << " ";
    }


    return 0;
}
5.二分+dfs,预处理所有的字符串长度,分前半部分、后半部分和wow分别处理
#include <bits/stdc++.h>
using namespace std;

vector<long long>count_;
string s = "MeiTuan";

char dfs(long long k, long long cur_len) {
    // cout << k << endl;
    if(k <= s.size()) return s[k - 1];
    // cout << count_[i] << endl;
    if(k == cur_len || k == cur_len - 2) return 'w';
    if(k == cur_len - 1) return 'o';
    long long next_len = (cur_len - 3) / 2;
    if(k > next_len) {//k在后半部分
        k -= next_len;
        return dfs(next_len - k + 1, next_len);        
    }
    return dfs(k, next_len);
}

int main() {

    long long x = 7;
    long long y = LLONG_MAX;
    while(true) {
        count_.push_back(x);
        if(x >= (y - 3) / 2) break;
        x = x * 2 + 3;
    }

    int T;
    cin >> T;
    while(T--) {
        long long k;
        cin >> k;
        int i = upper_bound(count_.begin(), count_.end(), k) - count_.begin();
        long long cur_len = count_[i];
        cout << dfs(k, cur_len) << endl;

    }


    return 0;

}






#美团笔试##笔试##阿里巴巴##华为##京东#
全部评论
俩ac俩80一个70,知道自己写的不对但就是不知道咋改
1 回复 分享
发布于 2022-08-06 11:44
算法岗是前4道加3个多选题
1 回复 分享
发布于 2022-08-06 11:59
最后一题91%,不知道咋改😥
点赞 回复 分享
发布于 2022-08-06 11:49
ak的这么多。。
点赞 回复 分享
发布于 2022-08-06 11:59
大佬 最后一道啥思路
点赞 回复 分享
发布于 2022-08-06 12:02
怎么这么多ak的。。。
点赞 回复 分享
发布于 2022-08-06 12:07
有没有跟我一样思路的,后面部分全部相同
点赞 回复 分享
发布于 2022-08-06 12:33
第五题直接考虑字串循环的话73😂😂
点赞 回复 分享
发布于 2022-08-06 13:22

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
2
21
分享
牛客网
牛客企业服务