美团笔试 美团笔试题 0316

笔试时间:2024年03月16日

历史笔试传送门:2023秋招笔试合集

第一题

题目:小美点外卖

小美是美团外卖的忠实用户,她经常去美团外卖 app 上面点外卖,因为会员红包的性价比太高啦!现在小美点了若干道菜,她希望你计算一个订单的总价。你能帮帮她吗?

输入描述

第一行输入一个正整数n,代表菜品总数。

第二行输入n个正整数,代表每道菜的价格。

第三行输入两个正整数x和y,x代表满减的价格,y代表红包的价格。

1<=n<=10^5

1<=x,y,ai<=10^9

保证所有的和大于,保证会用到满减。

输出描述

一个正整数,代表小美最终应付的钱数。

样例输入

4

10 20 10 20

25 10

样例输出

25

说明

四个菜一共 60 元,满减减掉了 25 元,再用一个 10 元的红包,因此需要付 25 元。

参考题解

直接统计所有的总价值,减去减免的价格即可。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>

int main() {
    int num;
    std::cin >> num;
    long long sum = 0;
    for (int i = 0; i < num; ++i) {
        long long temp;
        std::cin >> temp;
        sum += temp;
    }
    long long l1, l2;
    std::cin >> l1 >> l2;
    sum = sum - l1 - l2;
    std::cout << sum << std::endl;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int num = in.nextInt();
        long sum = 0l;
        for (int i = 0; i < num; i++) {
            long temp = in.nextLong();
            sum += temp;
        }
        long l1 = in.nextLong();
        long l2 = in.nextLong();
        sum = sum - l1 - l2;
        System.out.println(sum);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

num = int(input())
sum = 0
for i in range(num):
    temp = int(input())
    sum += temp
l1, l2 = map(int, input().split())
sum = sum - l1 - l2
print(sum)

第二题

题目:小美的合法单词

小美定义以下三种单词是合法的:

  1. 所有字母都是小写。例如:good
  2. 所有字母都是大写。例如:APP
  3. 第一个字母大写,后面所有字母都是小写。例如:Alice

现在小美拿到了一个单词,她每次操作可以修改任意一个字符的大小写。小美想知道最少操作几次可以使得单词变成合法的?

输入描述

一个仅由大写字母和小写字母组成的字符串,长度不超过10^5。

输出描述

一个整数,代表操作的最小次数。

样例输入

AbC

样例输出

1

说明

变成 ABC 或者 Abc 均可。只需要一次操作。

参考题解

统计大小写出现次数,取大改小,小改大,首字母是大写后边都改为小写三种取最小。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <string>

int main() {
    std::string s;
    std::getline(std::cin, s);
    int small = 0, big = 0;
    int res = s.length();
    for (int i = 0; i < s.length(); ++i) {
        char ch = s[i];
        if(ch >= 'a' && ch <= 'z') 
            small++;
        else if(ch >= 'A' && ch <= 'Z') 
            big++;
    }
    int temp = s.length();
    if(s[0] >= 'A' && s[0] <= 'Z') 
        temp = s.length() - 1 - small;
    res = std::min(std::min(small, big), temp);
    std::cout << res << std::endl;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String s = in.nextLine();
        int small = 0, big = 0;
        int res = s.length();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if(ch >= 'a' && ch <= 'z') small++;
            else if(ch >= 'A' && ch <= 'Z') big++;
        }
        int temp = s.length();
        if(s.charAt(0) >= 'A' && s.charAt(0) <= 'Z') temp = s.length() - 1 - small;
        res = Math.min(Math.min(small, big), temp);
        System.out.println(res);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

s = input()
small = sum(1 for ch in s if ch.islower())
big = sum(1 for ch in s if ch.isupper())
res = len(s)
temp = len(s)
if s[0].isupper():
    temp = len(s) - 1 - small
res = min(min(small, big), temp)
print(res)

第三题

题目:翻倍元素

小美拿到了一个数组,她每次操作会将除了第x个元素的其余元素翻倍,一共操作了q次。请你帮小美计算操作结束后所有元素之和。由于答案过大,请对10^9+7取模。

输入描述

第一行输入两个正整数n,q,代表数组的大小和操作次数。

第二行输入n个正整数ai,代表数组的元素。

接下来的q行,每行输入一个正整数xi,代表第i次操作未被翻倍的元素。

1<=n,q<=10^5,1<=xi<=n,1<=ai<=10^9

输出描述

一个整数,代表操作结束后所有元素之和模10^9+7的值。

样例输入

4 2

1 2 3 4

1

2

样例输出

34

说明:第一次操作后,数组变成[1,4,6,8],第二次操作后,数组变成[2,4,12,16],所有元素之和为 34。

参考题解

使用数组记录翻倍次数,结合快速幂进行优化;

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>

const int MOD = 1000000007;

long long powMod(long long x, int n, int MOD) {
    long long result = 1;
    x = x % MOD;
    while (n > 0) {
        if (n & 1) {
            result = (result * x) % MOD;
        }
        x = (x * x) % MOD;
        n >>= 1;
    }
    return result;
}

int main() {
    int n, q;
    std::cin >> n >> q;
    std::vector<int> nums(n);
    std::vector<int> times(n, q);

    for (int i = 0; i < n; ++i) {
        std::cin >> nums[i];
    }

    for (int i = 0; i < q; ++i) {
        int x;
        std::cin >> x;
        times[x - 1]--;
    }

    long long sum = 0;
    for (int i = 0; i < n; ++i) {
        long long val = (long long)nums[i] * powMod(2, times[i], MOD) % MOD;
        sum = (sum + val) % MOD;
    }

    std::cout << sum << std::endl;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static final int MOD = 1000000007;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int q = scanner.nextInt();
        int[] nums = new int[n];
        int[] times = new int[n];

        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
            times[i] = q;
        }

        for (int i = 0; i < q; i++) {
            int x = scanner.nextInt();
            times[x -

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

评论
2
10
分享

创作者周榜

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