美团笔试 美团笔试题 后端 0810

笔试时间:2024年08月10日 后端笔试

历史笔试传送门:2023秋招笔试合集

第一题

题目:小美的密码

小美准备登录美团,需要输入密码,小美忘记了密码,只记得密码可能是 n个字符串中的一个。小美会按照密码的长度从小到大依次尝试每个字符串,对于相同长度的字符串,小美随机尝试,并且相同的密码只会尝试一次。小美想知道,她最少需要尝试多少次才能登录成功,最多需要尝试多少次才能登录成功。小美不会重新尝试已经尝试过的字符串。成功登录后会立即停止尝试。

输入描述

第一行输入一个整数 n(1<=n<=1000)代表密码字符串的个数。

第二行输入一个只由小写字母组成的字符串 s(1<=|s|<=1000)代表正确的密码。

接下来 n 行,每行输入一个长度不超过 1000的字符串,代表小美记得的密码。

输出描述

在一行上输出两个整数,表示最少和最多尝试次数。

样例输入

4

ab

abc

ab

ac

ac

样例输出

1 2

说明

小美可能按照 ["ab", "ac", "abc"] 的顺序尝试,第一次尝试成功,也可能按照 ["ac", "ab", "abc"] 的顺序尝试,第二次尝试成功。

小美在尝试 "ac" 发现不正确后不会继续尝试 "ac"。

参考题解

哈希表

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <unordered_map>
#include <set>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    string ans;
    cin >> ans;
    
    unordered_map<int, set<string>> pos;
    for (int i = 0; i < n; ++i) {
        string p;
        cin >> p;
        pos[p.size()].insert(p);
    }
    
    vector<pair<int, set<string>>> sorted_pos(pos.begin(), pos.end());
    sort(sorted_pos.begin(), sorted_pos.end());
    
    int step = 0;
    int MIN = -1, MAX = -1;
    for (const auto& [k, v] : sorted_pos) {
        if (v.find(ans) != v.end()) {
            MIN = step + 1;
            MAX = step + v.size();
        } else {
            step += v.size();
        }
    }
    
    cout << MIN << " " << MAX << endl;
    
    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();
        String ans = scanner.next();
        
        Map<Integer, Set<String>> pos = new HashMap<>();
        for (int i = 0; i < n; i++) {
            String p = scanner.next();
            pos.computeIfAbsent(p.length(), k -> new HashSet<>()).add(p);
        }
        
        List<Map.Entry<Integer, Set<String>>> sortedPos = new ArrayList<>(pos.entrySet());
        sortedPos.sort(Map.Entry.comparingByKey());
        
        int step = 0;
        int MIN = -1, MAX = -1;
        for (Map.Entry<Integer, Set<String>> entry : sortedPos) {
            Set<String> v = entry.getValue();
            if (v.contains(ans)) {
                MIN = step + 1;
                MAX = step + v.size();
            } else {
                step += v.size();
            }
        }
        
        System.out.println(MIN + " " + MAX);
        
        scanner.close();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

from collections import defaultdict

n = int(input())
ans = input()

pos = defaultdict(set)
for _ in range(n):
    p = input()
    pos[len(p)].add(p)

pos = dict(sorted(pos.items()))

step = 0
MIN,MAX = -1,-1
for k,v in pos.items():
    if ans in v:
        MIN =step + 1
        MAX = step + len(v)
    else:
        step += len(v)

print(MIN, MAX)

第二题

题目:小美的数组删除

小美有一个长度为 n 的数组 a1,a2,....,an ,他可以对数组进行如下操作:

  • 删除第一个元素 a1,同时数组的长度减一,花费为 x。
  • 删除整个数组,花费为 k*MEX(a) (其中 MEX(a) 表示 a 中未出现过的最小非负整数。例如 [0,1,2,4] 的 MEX 为 3 )。

小美想知道将 a 数组全部清空的最小代价是多少,请你帮帮他吧。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数 T(1<=T<=1000) 代表数据组数,每组测试数据描述如下:

第一行输入三个正整数 n,k,x(1<=n<=2*10^5, 1<=k,x<=10^9) 代表数组中的元素数量、删除整个数组的花费系数、删除单个元素的花费。

第二行输入 n 个整数 a1,a2,....,an(0<=ai<=n),表示数组元素。

除此之外,保证所有的 n 之和不超过 2*10^5。

输出描述

对于每一组测试数据,在一行上输出一个整数表示将数组中所有元素全部删除的最小花费。

样例输入

1

6 3 3

4 5 2 3 1 0

样例输出

15

说明:

若不执行操作一就全部删除,MEX{4,5,2,3,1,0} = 6,花费 18 ;

若执行一次操作一后全部删除,MEX{5,2,3,1,0} = 4,花费 3+12;

若执行两次操作一后全部删除,MEX{2,3,1,0} = 4,花费 6+12 ;

若执行三次操作一后全部删除,MEX{3,1,0} = 2,花费 9+6 ;

若执行四次操作一后全部删除,MEX{1,0} = 2,花费 12+6 ;

若执行五次操作一后全部删除,MEX{0} = 1,花费 15+3;

若执行六次操作一,MEX{} = 0,花费 18;

参考题解

动态规划+维护动态最小未出现的整数。f[i]表示从i往后考虑的最小花费,选择就是选择第一个元素或者直接删除后续所有的元素。对于删除后续所有的元素的选项,我们必须要直到MEX是多少,我们可以用在更新dp的过程中,用一个suffix不断地更新当前的最小未出现的整数。虽然这里出现了两层循环的嵌套,但是并不会重置参数,因此复杂度是O(n).

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <climits>
using namespace std;

int main() {
    int T;
    cin >> T;
    while (T--) {
        long long n, k, x;
        cin >> n >> k >> x;
        
        vector<long long> A(n);
        for (int i = 0; i < n; ++i) {
            cin >> A[i];
        }
        
        vector<long long> dp(n + 1, LLONG_MAX);
        dp[n] = 0;
        
        set<int> vst;
        int suffix_MEX = 0;
        
        for (int i = n - 1; i >= 0; --i) {
            vst.insert(A[i]);
            while (vst.count(suffix_MEX)) {
                suffix_MEX++;
            }
            dp[i] = min(dp[i + 1] + x, k * suffix_MEX);
        }
        
        cout << dp[0] << endl;
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

public class Main {
    public static void main(Strin

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论
第一题为什么用Map呢 直接用set保存所有的字符串,然后转成list按照长度排序,按照长度统计min和max可以吗
点赞 回复 分享
发布于 2024-09-06 21:59 天津

相关推荐

作业帮时间是随机的,今天下午测的。作业帮是10道选择题加2到算法题:选择题:考了数据结构排序二叉树,linux命令:awk&nbsp;'$NF'&nbsp;test&nbsp;这里的test是一个有多行数据的文件,这命令是输出该文件末行的内容。还考了mapreduce优化数据倾斜的办法这里我好像选错了有两个选项一个是把count(distinct&nbsp;)&nbsp;替换为sum()group&nbsp;by&nbsp;还有是将小文件先保存到内存中这两个好像是对的都可以优化数据倾斜此问题。还考了Flink的一些特性不过我还没学过flink,还考了kafka的高性能和低性能的一些问题,这我也是一脸懵。还考了六个盘的汉洛塔要移动几次才通过。然后是算法题,第一个是简单的二分查找,不过我只通过了94%,后面看估计是我对左右指针移动还是有点问题。第二个是leetcode32题,最长有效括号,可惜了我两个月前还写过但是还是没写对,只通过了63%。也不知道能不能过。阅文(寄了,以为是8.30考没想到是8.30结束结果只写了20分钟):这好像是前面是单选题,中间是不定项,后面是问答题单选题:考了hive内置函数,考了hive与spark的对比,hadoop节点默认备份是多少~(还考了斗破苍穹的主角是谁虽然我没看过印像中好像叫萧炎)不定项:有mysql中delete,drop和truncate这三者的区别特点(我对truncate完全没印象),还考了flink的一些知识。问答题:第一个是mapredce工作流程这个还好,第二个是如何解决spark数据倾斜的方法。这里时间不够了我一点没写,也没多少印象。这里我现在写一下加深点印象1.可以增加随机前缀或后缀:来打散数据分布,在后继计算中去除前后缀从而负载均衡2.广播小表,如果是原因是小表与大表join可以将小表广播到每个节点,避免产生数据倾斜。3.salting方法:为倾斜数据填加盐值,打散倾斜数据4.分区策略调整:通过自定义分区器或者合理选择内置分区器来均匀分布数据5.增大并行度:针对只有少量数据造成的倾斜任务,增加并行度可以更快地处理这些小任务6.数据预处理:合并一些小文件,fliter操作等第三四个就是写sql语句,第三个挺简单的就是第四题来不及看了。ok就是这些了,预祝大家都能找到自己想要的工作实现,我还是继续去沉淀去了,这一个月也不知道自己在忙些啥好像就是一直在刷算法题和sql题,八股都没怎么看,对组件的掌握还是太浅了。
查看14道真题和解析 投递阅文集团等公司10个岗位 数据人的面试交流地
点赞 评论 收藏
分享
05-23 19:39
已编辑
北京邮电大学 前端工程师
蹲个女生舍友,杭州西溪。--------------以下是正文--------------先说一下我个人情况,北邮通信工程,我在本科的时候做过几个微信小程序,忘光了。在今年2月份开始极速学习前端基础。代码算法方面,研一和大四的时候跟着代码随想录刷过一次。轻微流水账,这是一个记录贴。初衷希望能给0实习转码的同学一些鼓励,相信一定能找到愿意培养自己的公司。第一次找工作没什么经验,秋招会及时复盘面经发出来,这次就先不弄了。我从1月份就开始调研咋学习前端,开始慢悠悠学习html和css知识,到二月份开学了才开始对暑期实习感到十分的担忧,开始拼命学js。之前就接触过相关内容所以学的很快,半个月左右就学完了。然后就开始一边学习react一边做项目。4月初开始陆续投递,等了一周就开始有面试了。第一个面的美团,上来就是一个hard代码题,hot100还没刷完的我感到十分挫败。五月中旬之前,我一直处于反复一面的状态。基本上一天三面。晚上还得做笔试。崩溃边缘,但是还得鼓励(欺骗)自己下周必拿offer。或许是乐观的心态,让我在16号以后开始收到一些公司的二面了。包括美团,阿里(智能信息),腾讯,字节。我非常高兴,说明我五一不出去玩,恶补八股和手撕是真的有用。运气好了之后就开始一直破天荒的好。我阿里的淘天和阿里云也进二面了。我记得自己虽然表现的还行,但是整体并不突出。5月20/21号,这两天是小情侣过节的日子。我记得我20号面了美团,阿里智能信息二面,21号面了腾讯,字节,淘天二面,晚上还做了一个笔试。累的半死的同时,实验室导师还在催我的科研进度,我回复:好的。没想到,阿里智能信息居然问了我通信原理,本科学科等很多很泛的问题。我以为要凉了,结果没过一个小时,hr联系我:你好,你的二面已经通过,需要您再做一个线上笔试。我欣喜若狂,不敢相信二面居然问这些都能过。笔试做完了之后,也是立马有hr联系我,约hr面。5月22号,hr面。当场发offer,我整个人都懵了。心里怀疑对方是不是诈骗公司,然后又反复确认。缓了半天,才发现自己居然能去阿里了。简直是做梦都不敢想。我记得我前几天面试压力太大,还梦到过实验室组会汇报自己的offer进度,大家都去阿里。而我连甚至一个offer都没有可以汇报。当场吓醒。最后必须说,阿里真的太好了,愿意相信实习生的潜力,真的给了很多0实习的同学实习机会。我永远是阿里孝女!!!!!---------------分割线-----------记录一下自己转码以来遇到的一些贵人。1.字节的一面面试官,在我最崩溃的时候给了我鼓励和肯定。当时给我面了一个半小时。最后我问他对建议的时候,他说,“你是候选人里面算是比较优秀的了,但是我们这个业务要求很高,我担心把你招进来影响你的成长。”并且还给我推荐学习资料,红宝书。还和我说,“如果你想要继续做前端的话,我可以告诉你,前端依然是十分有前途的方向,希望你可以继续努力。”他的话真的十分中肯。当时我甚至感动哭了,我非常清楚自己不是因为被拒绝哭了(毕竟其实已经麻了)2.腾讯的一位面试官。给了我很多叮咛,告诉我准备好在面试等等。让我感觉十分有力量,我当时觉得我身边那么多帮助我的好人,我怎么可能不成功呢。3.北邮的一位学长,他在一开始给了我职业选择方面的建议,让我坚定了自己的道路。4.我遇到的每一个面试官都出奇的好,没有因为我很菜就表现不耐烦,十分感恩他们的手下留情。5.感谢有对象的陪伴,让我有好好吃饭的动力,并且也一直督促我学习,还帮我把一些高频的手撕和高频的计算机相关的八股梳理出来。有的时候真的想放弃,但是他一直在我旁边和我说,一定要坚持,不能放弃。
点赞 评论 收藏
分享
评论
4
12
分享

创作者周榜

更多
牛客网
牛客企业服务