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多种语言分析,解答。