美团笔试 美团笔试题 0406
笔试时间:2024年04月06日
历史笔试传送门:2023秋招笔试合集
第一题
题目:最小修改次数
小美拿到了一个长度为7的字符串。她想知道将该字符串修改为"meituan"至少需要修改多少次?每次修改,小美可以修改任意一个字符。
输入描述
输入一个长度为7的字符串,字符串中只包含小写字母。
输出描述
小美需要修改的次数。
样例输入
meituan
样例输出
0
参考题解
模拟计数即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <string> int main() { std::string target = "meituan"; std::string input_string; std::cin >> input_string; int cnt = 0; for (size_t i = 0; i < input_string.length(); ++i) { if (input_string[i] != target[i]) { ++cnt; } } std::cout << cnt << std::endl; return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner; public class Main { public static void main(String[] args) { String target = "meituan"; Scanner scanner = new Scanner(System.in); String inputString = scanner.next(); int cnt = 0; for (int i = 0; i < inputString.length(); i++) { if (inputString.charAt(i) != target.charAt(i)) { cnt++; } } System.out.println(cnt); scanner.close(); } }
Python:[此代码未进行大量数据的测试,仅供参考]
target = "meituan" string = input() cnt = 0 for i in range(len(string)): if string[i] != target[i]: cnt += 1 print(cnt)
第二题
题目:计算实数
小美拿到了一个由复数组成的数组,她想知道其中有多少个实数?
实数:有理数和无理数的总称。其中无理数是无限不循环小数,有理数包括整数和分数。
输入描述
第一行输入一个正整数,代表数组的大小。
第二行输入n个复数,代表小美拿到的数组。
后台数据保证复数为a或者a+bi的形式,其中a和b为绝对值不超过10^9的整数。
1<= n <=10^5
输出描述
一个整数,代表实数的数量。
样例输入
4
-5 5-i 6+3i -4+0i
样例输出
2
参考题解
模拟题。
将所有的"+0i"和"-0i"替换成空字符串,然后判断每个子串是否包含"i"即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <string> int main() { int n; std::cin >> n; std::vector<std::string> nums(n); for (int i = 0; i < n; ++i) { std::cin >> nums[i]; } int res = 0; for (std::string num : nums) { num.erase(num.find("+0i"), 3); num.erase(num.find("-0i"), 3); if (num.find('i') == std::string::npos) { ++res; } } std::cout << res << std::endl; return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); String[] nums = new String[n]; for (int i = 0; i < n; i++) { nums[i] = scanner.next(); } int res = 0; for (String num : nums) { num = num.replace("+0i", "").replace("-0i", ""); if (!num.contains("i")) { res++; } } System.out.println(res); scanner.close(); } }
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input()) nums = input().split() res = 0 for num in nums: num = num.replace("+0i", "").replace("-0i", "") if 'i' not in num: res += 1 print(res)
第三题
题目:还原数组
小美有一个由 n 个互不相等的正整数构成的数组 a,但她一不小心把 a 弄丢了,他想要重新找到 a。好在她并不是一无所有,她还记得以下有关 a 的信息:
1. 他完全记得数组 b 的样子,并且 b 是数组 a 删除了某个 a_i 后,剩余的部分做前缀和并打乱的结果。
2. 他完全记得数组 c 的样子,并且 c 是数组 a 删除了某个 a_j 后,剩余的部分做前缀和并打乱的结果。(保证两次删除的 a_i 和 a_j 不是同一个 a 中的元素)。
请你帮她还原出 a 数组吧。
补充:前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)。
输入描述
输入包含三行。
第一行一个正整数 n\ (3 <=n <=10^5),表示数组 a 的长度。
第二行 n-1 个正整数 b_i\ (1 <=b_i <=10^{14}),表示题中所述数组 b。
第二行 n-1 个正整数 c_i\ (1 <=c_i <=10^{14}),表示题中所述数组 c。
输出描述
输出一行 n 个整数,表示你还原出的 a 数组。
样例输入
4
8 18 14
15 9 1
样例输出
1 8 6 4
参考题解
前缀和是有序的,因此可以直接排序。如此一来可以利用前缀和还原数组,我们以第一个数组nums1为基准,遍历第二个数组nums2,如果找到一个数字x是不存在于nums1的,假设我们定义x的下标是i,那么我们可以确定,x插入到nums1中,nums2[i+1]对应位置的前面。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <algorithm> #include <set> #include <iterator> int main() { int n; std::cin >> n; std::vector<int> b(n), c(n); for (int i = 0; i < n; ++i) std::cin >> b[i]; for (int i = 0; i < n; ++i) std::cin >> c[i]; // 前缀和是有序的,所以可以排序 std::sort(b.begin(), b.end()); std::sort(c.begin(), c.end()); std::vector<int> nums1(n - 1), nums2(n - 1); nums1[0] = b[0]; nums2[0] = c[0]; // 两个数组从左到右遍历,找到第一个不同的地方i,此时较大的位置的数组就是删除的元素 for (int i = 1; i < n - 1; ++i) { nums1[i] = b[i] - b[i - 1]; nums2[i] = c[i] - c[i - 1]; } std::set<int> s(nums1.begin(), nums1.end()); for (int i = 0; i < n - 1; ++i) { if (s.find(nums2[i]) == s.end()) { if (i == n - 2) { nums1.push_back(nums2[i]); for (int j = 0; j < nums1.size(); ++j) { if (j != 0) std::cout << " "; std::cout << nums1[j]; } std::cout << std::endl; break; } else { auto it = std::find(nums1.begin(), nums1.end(), nums2[i + 1]); int index = std::distance(nums1.begin(), it); nums1.insert(nums1.begin() + index, nums2[i]); for (int j = 0; j < nums1.size(); ++j) { if (j != 0) std::cout << " "; std::cout << nums1[j]; } std::cout << std::endl; break; } } } return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] b = new int[n];
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。