2023 美团笔试题 0401
笔试时间:2023年04月01日 春招实习
第一题
题目:算数
小美在数学课上学会了加减乘除,现在她想多进行一些算数训练来加强自己的计算能力。为了不重复出题,她想出一个好方法。她先写下了一排n个数(n≥2),依次用加号连接。举例来说,小美可能写下了如下的式子1+4+7+4+2+3+1共7个数以及6个加号。接着小美以一种全新的方式进行出题:她每次选择一个加号,将它改变成加减乘除中的一个(虽然很奇怪,但小美认为加号也可以被改成加号,尽管不会产生任何影响),然后计算整个式子的结果。值得注意的是,小美认为每次操作不对后续操作产生影响,详见样例解释。小美认真做了很多次算数训练,现在她想让作为她好朋友的你帮她用程序计算一次,方便她核对答案。
输入描述
第一行一个整数n,含义见题面。
接下来一行n个整数a1,a2,..,an,依次表示小美初始写下的连加算式中的每一个数。
接下来一个整数m,表示小美做了m次算数训练
接下来2m个以空格分开数字或符号 t1,o1, t2,o2, ... tm,om,其中ti为数字,oi是'+','-','*','/'(即加减乘除符号,不含引号)中的一个符号,表示第 i 次操作选定了第ti个加号,将其改变为了oi。
对于所有的的数据,2≤N≤50000,1≤M≤50000,1≤ai≤500,1≤ti<N,oi∈{+,-,*,/}
输出描述
输出一行m个整数,分别表示每次操作的答案,结果四舍五入到一位小数。
样例输入
5
1 2 4 2 5
3
1 - 2 * 4 /
样例输出
10.0 16.0 7.4
解释:
第一次操作后算数式为1-2+4+2+5 = 10.0
第二次操作后算数式为1+2*4+2+5 = 16.0
第三次操作后算数式为1+2+4+2/5 = 7.4
值得注意的是,每次操作都认为对初始的全加号式子(此处为1+2+4+2+5)进行操作,操作之间互不影响。
参考题解
按照题意模拟。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
double perform_operation(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return static_cast<double>(a) / b;
default:
return 0;
}
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
// 计算原始算式的结果
int original_sum = 0;
for (int i = 0; i < n; ++i) {
original_sum += nums[i];
}
int m;
cin >> m;
vector<int> t(m);
vector<char> op(m);
for (int i = 0; i < m; ++i) {
cin >> t[i] >> op[i];
}
cout << fixed << setprecision(1);
for (int i = 0; i < m; ++i) {
int index = t[i] - 1;
char operation = op[i];
double result = original_sum - nums[index] - nums[index + 1];
result += perform_operation(nums[index], nums[index + 1], operation);
cout << result << " ";
}
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static double performOperation(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return (double) a / b;
default:
return 0.0;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; ++i) {
nums[i] = scanner.nextInt();
}
// 计算原始算式的结果
int originalSum = 0;
for (int i = 0; i < n; ++i) {
originalSum += nums[i];
}
int m = scanner.nextInt();
int[] t = new int[m];
char[] op = new char[m];
for (int i = 0; i < m; ++i) {
t[i] = scanner.nextInt();
op[i] = scanner.next().charAt(0);
}
for (int i = 0; i < m; ++i) {
int index = t[i] - 1;
char operation = op[i];
double result = originalSum - nums[index] - nums[index + 1];
result += performOperation(nums[index], nums[index + 1], operation);
System.out.printf("%.1f ", result);
}
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
def perform_operation(a, b, op):
if op == '+':
return a + b
elif op == '-':
return a - b
elif op == '*':
return a * b
elif op == '/':
return float(a) / b
else:
return 0.0
def main():
n = int(input())
nums = list(map(int, input().split()))
# 计算原始算式的结果
original_sum = sum(nums)
m = int(input())
t = []
op = []
for _ in range(m):
ti, opi = input().split()
t.append(int(ti))
op.append(opi)
for i in range(m):
index = t[i] - 1
operation = op[i]
result = original_sum - nums[index] - nums[index + 1]
result += perform_operation(nums[index], nums[index + 1], operation)
print("{:.1f}".format(result), end=" ")
if __name__ == "__main__":
main()
第二题
题目:整理
小美正在整理桌子上的一排装饰品。小美对待装饰品摆放方式的审美角度很奇特,她认为高度相差比较大的装饰品放在相邻位置会很难看,她想对这一排装饰品进行整理,可以交换任意两个装饰品的位置任意多次。假设当前从左到右n个装饰品的高度分别为h1,h2,...,hn,那么当前一排装饰品的丑陋值为,其中|x|为x的绝对值。小美想最小化她的装饰品的丑陋值,请你帮她排一下顺序。形式化地来讲,有一长为n的序列a1,a2,...,an,你可以任意次数地进行交换,每次交换都可以选择任意两个不同的数i,j,交换ai,aj的位置。经过若干次交换后,序列变为h1,h2,...,hn,其丑陋值为
,你需要找出一种交换方式,使得最终序列{hn}的丑陋值最小化。你不需要输出具体交换方式,只需要输出最终的{hn}序列的丑陋值即可。
输入描述
第一行一个整数n,表示小美的装饰品数量。
接下来一行n个整数a1,a2,...,an,依次表示从左到右n个装饰品的高度。
对于所有的数据:2≤N≤50000,0≤ai≤10^9。
输出描述
输出第一行一个数,为最优方案的最小丑陋值。
样例输入
3 3 1 2
样例输出
2
提示:
我们可以将3和1交换,得到1 3 2然后再将2和3交换,得到1 2 3可以证明,此时有最小丑陋值|1-2|+|2-3|=2
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
sort(a.begin(), a.end());
int res = 0;
for (int i = 0; i < n - 1; ++i) {
res += a[i + 1] - a[i];
}
cout << res << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = scanner.nextInt();
}
Arrays.sort(a);
int res = 0;
for (int i = 0; i < n - 1; ++i) {
res += a[
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。
查看16道真题和解析