美团笔试 美团笔试题 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)
第二题
题目:小美的合法单词
小美定义以下三种单词是合法的:
- 所有字母都是小写。例如:good
- 所有字母都是大写。例如:APP
- 第一个字母大写,后面所有字母都是小写。例如: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%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

正浩创新EcoFlow公司福利 647人发布