美团笔试 美团笔试题 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多种语言版本,持续更新中。

