美团8.12笔试 后端开发

第一题:排列判断是否相邻

有一个排列,一共有n个数,还有两个数x和y,请你判断x和y在排列中是否相邻,是则输出”Yes”,不是则输出”No”

1 ≤ n ≤ 1e5

输入n,x,y

注意判断x的前后有没有y即可;

第二题:环形公路最短距离

现有一条环形公路,总共有n个站点,a[i]代表第i个站点与第i+1个站点之间的距离,特殊的,a[n]表示第n个站点与第一个站点之间的距离。出发地为x,目的地为y,请你求出x到y的最短距离

1 ≤ n ≤ 1e5

1 ≤ a[i] ≤ 1e9

注意a[i]要用long int,判断正着走与反着走哪个小输出哪个

第三题:切蛋糕

现有一个n*m的蛋糕矩阵a,a[i][j]代表一小块蛋糕的美味度,现在小美要和一个好朋友分享蛋糕,因此需要把这个蛋糕矩阵切成两半,并且要求分成两半后的两块蛋糕的美味度尽可能相等,即求出分成两半后的两块蛋糕的abs(s1 - s2)的最小值,s1代表第一块蛋糕的美味度,s2代表第二块蛋糕的美味度。要求:必须保证每一小块蛋糕的完整性(即不能斜着切,如果把整个大蛋糕正着放)

1 ≤ n , m≤ 1e3

1 ≤ a[i][j] ≤ 1e5

因为只能横切或者竖切,那每次输入数组的时候保存下来每一行 以及 每一列的美味度之和,再遍历每次切的abs最小值判断即可。

#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
int main(){
    int n, m, temp;
    cin>>n>>m;
    vector<int> row(n,0);
    vector<int> col(m,0);
    int sum_all = 0;
    for(int i = 0; i < n; i++){
        int sum = 0;
        for(int j = 0; j < m; j++){
            cin>>temp;
            sum += temp;
            col[j] += temp;
            sum_all += temp;
        }
        row[i] = sum;
    }
    int half_row = 0, half_col = 0;
    int min_row = INT_MAX, min_col = INT_MAX;
    for(int i=0; i<n; i++){
        half_row +=row[i];
        int minus_row = abs(sum_all - 2*half_row);
        min_row = min(min_row,minus_row);
    }
    for(int i=0; i<m; i++){
        half_col += col[i];
        int minus_col = abs(sum_all - 2*half_col);
        min_col = min(min_col,minus_col);
    }
    int res = min(min_col,min_row);
    cout<<res<<endl;
    return 0;
}

第四题:字符串平铺成矩阵

一个长为n的字符串s,将其重组为一个二维矩阵,二维数组长宽x,y,那么x*y = n。

矩阵的权重定义为矩阵连通块的数量。定义上下左右四个方向相邻相同字符是连通的,希望矩阵的权重最小,求最小权重值。

比如 abcbbcbcc,可建立矩阵3*3 abc,bbc,bcc,此时权重为3。

可以遍历出所有x,y的组合,并对每一组x,y分别进行dfs,来计算矩阵的权重

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
void dfs(const string& s, int width, int height, int row, int col, vector<vector<bool>>& visited) {
    if (row < 0 || row >= height || col < 0 || col >= width || visited[row][col]) {
        return;
    }
    visited[row][col] = true;
    char currentChar = s[row * width + col];

    if (row > 0 && s[(row - 1) * width + col] == currentChar) {
        dfs(s, width, height, row - 1, col, visited);
    }
    if (row < height - 1 && s[(row + 1) * width + col] == currentChar) {
        dfs(s, width, height, row + 1, col, visited);
    }
    if (col > 0 && s[row * width + col - 1] == currentChar) {
        dfs(s, width, height, row, col - 1, visited);
    }
    if (col < width - 1 && s[row * width + col + 1] == currentChar) {
        dfs(s, width, height, row, col + 1, visited);
    }
}

int computeWeight(const string& s, int width, int height) {
    int weight = 0;
    vector<vector<bool>> visited(height, vector<bool>(width, false));

    for (int i = 0; i < height; ++i) {
        for (int j = 0; j < width; ++j) {
            if (!visited[i][j]) {
                dfs(s, width, height, i, j, visited);
                weight++;
            }
        }
    }
    return weight;
}

int minWeight(string s, int n) {
        int minWeight = INT_MAX;
        // 遍历不同的宽高组合
        for (int width = 1; width <= n; ++width) {
            for (int height = 1; height <= n; ++height) {
                if (width * height == n) {
                    int weight = computeWeight(s, width, height);
                    minWeight = min(minWeight, weight);
                }
            }
        }
        return minWeight;
    }

int main() {
    int n;
    string s;
    cin>>n;
    cin>>s;
    int result = minWeight(s, n);
    cout << "Minimum weight: " << result << endl;
    return 0;
}

第五题 染色问题

一个树,每个节点一个值,初始每个节点都是白色,每次操作可以选择一组相邻节点,如果两个节点都是白色并且乘积为完全平方数,可以把这两个节点同时染红,问最多能染红多少个节点

输入第一行n个节点,第二行每个节点权值,后面n-1行每行两个数代表这两个节点中间有边相连

思路:树形dp

#美团信息集散地##美团嵌入式#
2023C++/嵌入式笔试汇总 文章被收录于专栏

2023C++/嵌入式笔试汇总,持续更新

全部评论
切蛋糕那样写好像有一个测试用例过不了
点赞 回复 分享
发布于 2023-08-19 15:39 湖北
问一下可以用本地ide吗
点赞 回复 分享
发布于 2023-08-18 21:12 陕西
美团笔试有选择吗
点赞 回复 分享
发布于 2023-08-16 11:30 黑龙江

相关推荐

点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
10
17
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务