美团笔试 美团笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
3 12 评论
分享
牛客网
牛客企业服务