2020美团前端笔试题

美团:

题目1:蛋糕奶茶(数组)

题目描述:

小团的蛋糕铺长期霸占着美团APP中“蛋糕奶茶”栏目的首位,因此总会吸引各路食客前来探店。
小团一天最多可以烤n个蛋糕,每个蛋糕有一个正整数的重量。
早上,糕点铺已经做好了m个蛋糕。
有一个顾客要来买两个蛋糕,他希望买这一天糕点铺中最重的和最轻的蛋糕,并且希望这两个蛋糕的重量恰好为a和b。剩余的n-m个蛋糕可以现烤,请问小团能否满足他的要求?

输入描述:

输入包含多组数据,每组数据两行。
每组数据的第一行包含4个整数,n,m,a,b,空格隔开。这里不保证a和b的大小关系。
接下来一行m个数,空格隔开,代表烤好的蛋糕重量。
1≤n,m,a,b≤1000 , m≤n , 蛋糕重量不会超过1000

输出描述:

对于每一组数据,如果可以办到顾客的要求,输出YES,否则输出NO

样例输入:

4 2 2 4
3 3
4 2 2 4
1 1
4 2 2 4
5 5
4 2 4 2
2 4
2 2 2 4
3 3
3 2 2 4
3 3

样例输出:

YES
NO
NO
YES
NO
NO

解题思路:(AC 18.8%)

/* 
 思路:先判断剩余可做的蛋糕数量以及做好的蛋糕中包含自己所需蛋糕的个数count
    三种情况:
      1.如果不能再做蛋糕,则count必须为2
      2.如果还可以再做一个蛋糕,则count至少为1
      3.如果还能做两个蛋糕,count为1或2,则能满足客户的需求。否则需要满足的条件是客户想要的两个蛋糕的重量一个应该大于所有做好的重量,一个应该小于所有做好的重量
 */
var start = read_line();
while (start) {
    var [n, m, a, b] = start.split(" ");
    var dones = read_line().split(" ");
    if (parseInt(dones[0]) > parseInt(dones[1])) {
        var tmp = dones[0];
        dones[0] = dones[1];
        dones[1] = tmp;
    }
    var left = n - m;
    var muti = 0;
    for (var i = 0; i < dones.length; i++) {
        if (dones[i] == a) {
            muti++;
        }
        if (dones[i] == b) {
            muti++;
        }
    }
    if (left == 0) {
        if (muti == 4) {
            print("YES");
        } else {
            print("NO");
        }
    }
    if (left == 1) {
        if (muti > 0) {
            print("YES");
        } else {
            print("NO");
        }
    }
    if (left >= 2) {
        if (muti > 0) {
            print("YES");
        } else {
            if (a < dones[0] && b > dones[1]) {
                print("YES");
            } else {
                print("NO");
            }
        }
    }
    start = read_line();
}

题目2:晋级人数(数组)

题目描述:

小团是某综艺节目的策划,他为某个游戏环节设计了一种晋级规则,已知在这个游戏环节中每个人最后都会得到一个分数score_i,显而易见的是,游戏很有可能出现同分的情况,小团计划该环节晋级人数为x人,则将所有人的分数从高到低排序,所有分数大于等于第x个人的分数且得分不为0的人都可以晋级。
请你求出本环节的实际晋级人数。显然这个数字可能是0,如果所有人的得分都是0,则没有人满足晋级条件。

输入描述:

输入第一行包含两个正整数n和x,分别表示参加本环节的人数,和小团指定的x。
输入第二行包含n个整数,每个整数表示一位选手的得分。

输出描述:

输出仅包含一个整数,表示实际晋级人数。

样例输入:

5 4 
0 0 2 3 4

样例输出:

3

解题思路:(AC 18.8%)

/* 
    将选手的得分从高到低排列
    将晋级的人数作为循环的次数,如果分数不为0,则总数+1
*/
[n, x] = read_line().split(" ");
var scores = read_line()
.split(" ")
.map((item) => {
    return parseInt(item);
});
scores.sort((a, b) => b - a);
var count = 0;
for (var i = 0; i < x; i++) {
    if (scores[i] != 0) {
        count++;
    }
}
print(count);

题目3:寿司最大和(环形链表)

题目描述:

小美请小团吃回转寿司。转盘上有N盘寿司围成一圈,第1盘与第2盘相邻,第2盘与第3盘相邻,…,第N-1盘与第N盘相邻,第N盘与第1盘相邻。小团认为第i盘寿司的美味值为A[i](可能是负值,如果小团讨厌这盘寿司)。现在,小团要在转盘上选出连续的若干盘寿司,使得这些寿司的美味值之和最大(允许不选任何寿司,此时美味值总和为0)。

输入描述:

第一行输入一个整数T(1<=T<=10),表示数据组数。
每组数据占两行,第一行输入一个整数N(1<=N<=10^5);
第二行输入N个由空格隔开的整数,表示A[1]到A[N](-10^4<=A[i]<=10^4)。

输出描述:

每组数据输出占一行,输出一个整数,表示连续若干盘寿司的美味值之和的最大值。

样例输入:

1
4
3 -2 4 -1

样例输出:

6

解题思路:(AC18.8%)

/* 
    这里考察的就是环形链表连续相加的最大值
    将最后一个元素前面的所有元素依次添加在数组的最后,形成一个假的环.......
    然后外循环遍历每一个元素,内循环将每一个元素与后面所有的元素相加,如果和有大于之前的和,则将之前的最大值替换掉
*/
var groups;
while ((groups = read_line()) != "") {
    var itemCount = read_line();
    var arr = read_line()
    .split(" ")
    .map((item) => {
        return parseInt(item);
    });
    var newArr = [...arr];
    for (var i = 0; i < arr.length - 1; i++) {
        newArr.push(arr[i]);
    }
    var max = 0;
    for (var i = 0; i < newArr.length; i++) {
        var currentMax = 0;
        for (var j = i + 1; j < i + 1 + arr.length; j++) {
            currentMax += newArr[j];
            if (currentMax > max) {
                max = currentMax;
            }
        }
    }
    print(max);
}

题目4:取苹果(树)

题目描述:

小团找到一颗有n个节点的苹果树,以1号节点为根,且每个节点都有一个苹果,苹果都有一个颜色,但是这棵树被施加了咒术,这使得小团只能从某一个节点的子树中选取某一种颜色的拿。小团想要拿到数量最多的那种颜色的所有苹果,请帮帮她。每次她会指定一个节点t,如果小团只能从节点t的子树中选取某一种颜色的苹果,选取什么颜色能拿到最多的苹果?如果有多种颜色都可以拿同样多的苹果,输出颜色编号最小的那个对应的编号。

节点x的子树定义为所有将x当作祖先的节点,x也视为x的子树的一部分。

输入描述:

第一行一个正整数 n 表示这颗树上节点的个数。
接下来n-1行,每行两个正整数x­­i , yi,表示树上第i条边连接的两个节点。
接下来一行n个正整数c­i,分别表示从1~n号节点上的苹果的颜色。
接下来一行一个正整数q,表示接下来有q次独立的询问。
接下来q行,每行一个正整数t表示询问:如果小团只能从节点t的子树中选取某一种颜色的苹果,选取什么颜色能拿到最多的苹果?如果有多种颜色都可以拿同样多的苹果,输出颜色编号最小的那个对应的编号。
n ≤ 5000,  1≤xi,yi,t≤n,  ci≤1000000000,  q≤10000

输出描述:

输出q行,每行一个整数,表示答案。

样例输入:

7
1 2
1 3
2 4
2 5
3 6
3 7
1 1 2 1 2 2 3
7
1
2
3
4
5
6
7

样例输出:

1
1
2
1
2
2
3

解题思路:(未写完)

/* 
    按照颜色值建立一颗二叉搜索树,然后找出给定子树中值最大的节点,即最右下角的节点。对于重复的元素,每个节点需要创建一个链表?
*/
function Node(key, value) {
    this.element.key = key;
    this.element.value = value;
    this.left = null;
    this.right = null;
}
var nodeCount = read_line();
var root = null;
function insertNode(node, newNode) {
    if (!node) {
        root = newNode;
    }
    if (newNode.element.key >= node.element.key) {
        if (!node.right) {
            node.right = newNode;
        } else {
            insertNode(node.right, newNode);
        }
    } else {
        if (!node.left) {
            node.left = newNode;
        } else {
            insertNode(node.left, newNode);
        }
    }
}
while (nodeCount) {
    var oneNode = read_line()
    .split(" ")
    .map((item) => {
        return parseInt(item);
    });
    var node = new Node(oneNode[1], oneNode[0]);
    insertNode(root, node);
    nodeCount--;
}
function max(node) {
    if()
       }
    while ((test = readline()) != '') {

    }

题目5:最多执行的任务(图?)

题目描述:

你在接下来会接到n个任务,第 i 个任务有开始时间点si和结束时间点ti,表示这个任务必须在时间点p(si≤p≤ti   p为正整数)完成,在每个时间点,你至多只能完成一个任务,假设时间点从1开始,你最多可以完成这些任务里的多少个任务?

输入描述:

一个正整数n,表示任务数为n。
接下来n行每行两个数字s, t,分别表示该任务的开始时间点和结束时间点。
1 ≤ n ≤ 2×10^5
1 ≤ s ≤ t ≤ 10^9

输出描述:

一个整数x,表示最多可以完成的任务数。

样例输入和输出:

样例输入
4
1 1
1 2
2 2
2 3
样例输出
3

输入样例2
5
2 3
1 2
3 3
3 4
1 5

输出样例2
5

解题思路:(AC18.8%)

/* 
    先保存一个对象,里面以键值对的形式存储了某一天会执行的任务
    对于每一个新的任务,将起始时间和最终时间作为一个循环的起始值和最终值(提交的代码里写错了),判断这段时间里面有没有空闲的时间可以存储在之前的对象中,若有,则总任务数+1
*/
var taskCount = read_line();
var rs = {};
var count = 0;
while ((item = read_line()) != "") {
    item = item.split(" ");
    for (var i = 0; i < item.length; i++) {
        if (rs[item[i]]) {
        } else {
            rs[item[i]] = item[i];
            count++;
        }
    }
}
print(count);
  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值