美团笔试 美团笔试题 0308

笔试时间:2025年03月08 春招实习

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

第一题

题目:小美的文本加密

小美有一个加密的字符串s,你无意之间得到了他的加密方式,尝试解开它吧!初始时,解密字符串t为空,除此之外,还有一个记录位移的整数p为0。依次对每一个i= 1,2,...,|s|进行以下操作(其中|s|代表字符串 s的长度):如果 s的第i个字符为数字x,则需要对p修改,具体地:若p=0,则将p置为x(即p>x);若p≠0,则将P中的数字全部向高位移动一位,随后将空出来的个位填上x(即p→ 10p+x);如果s的第i个字符不为数字,则需要先将字符串左移p 位 (即 t1t2···tptp+1···t|t|→ tp+1···t|t|t1t2···tp),随后将p重新置为0,再对t修改,具体地:若字符为R,则反转字符串t;字符不为R,则直接将这个字符添加到字符串t的结尾;请你直接输出解密完成后的字符串t。

输入描述

每个测试文件均包含多组测试数据。

第一行输入一个整数T(1≤T<=10)代表数据组数,每组测试数据描述如下

在一行上输入一个长度为|s|(1<=|s|<=10^3),且由大小写字母和数字混合构成的字符串 s代表小美的加密串。

输出描述

对于每一组测试数据,在一行上输出一个字符串,代表解密完成后的字符串。

样例输入

2

meRD2o

D0ame3

样例输出

Demo

Dame

参考题解

直接模拟即可。

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

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 读取整行并忽略缓冲区中剩余内容

    while(n--){
        string s;
        getline(cin, s);
        string t = "";
        long long p = 0;

        for(char c : s){
            if(isdigit(c)){
                // 累加数字
                p = p * 10 + (c - '0');
            } else {
                // 进行旋转
                long long num = p;
                if(t.size() > 1){
                    num = p % t.size(); // 只有长度大于 1 才需要取模
                }
                // 将 t 的前 num 部分旋转到后面
                // C++ substr 超过范围不会报错,而是返回可获取到的最大子串
                t = t.substr(num) + t.substr(0, num);

                // 重置 p
                p = 0;

                // 根据字符 c 进行对应操作
                if(c == 'R'){
                    // 反转
                    reverse(t.begin(), t.end());
                } else {
                    // 将字符附加到末尾
                    t.push_back(c);
                }
            }
        }
        cout << t << "\n";
    }

    return 0;
}

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

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine()); // 先读取行,再转换为整数

        while(n-- > 0) {
            String s = sc.nextLine();
            StringBuilder t = new StringBuilder();
            long p = 0;

            for(char c : s.toCharArray()) {
                if(Character.isDigit(c)) {
                    // 累加数字
                    p = p * 10 + (c - '0');
                } else {
                    // 进行旋转
                    long num = p;
                    if(t.length() > 1) {
                        num = p % t.length(); // 只有长度大于 1 才需要取模
                    }

                    // 将 t 的前 num 部分旋转到后面
                    String rotated;
                    if(num < t.length()) {
                        rotated = t.substring((int)num) + t.substring(0, (int)num);
                    } else {
                        // num >= t.length() 的情况,旋转相当于不变
                        rotated = t.toString();
                    }

                    // 用旋转后的结果替换
                    t = new StringBuilder(rotated);

                    // 重置 p
                    p = 0;

                    // 根据字符 c 进行对应操作
                    if(c == 'R') {
                        // 反转
                        t.reverse();
                    } else {
                        // 将字符附加到末尾
                        t.append(c);
                    }
                }
            }

            // 输出结果
            System.out.println(t);
        }

        sc.close();
    }
}

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

n = int(input())
for _ in range(n):
    s = input()
    t = ""
    p = 0
    for c in s:
        if c.isdigit():
            p = p*10+int(c)
        else :
            num = p
            if len(t) > 1:
                num = p%len(t)
            t = t[num:]+t[:num]
            p = 0
            if c == 'R':
                t = t[::-1]
            else:
                t += c
    print(t)

第二题

题目:小美架炮

在无限大的棋盘中有n个炮,第个炮的坐标是(xi,yi)。已知每个炮的攻击方式是:先选一个攻击方向(上、下、左、右),该方向上看见的第一个棋子为"炮架",该炮可以通过炮架攻击到炮架后面的棋子(只能攻击到炮架后面的第一个)小美希望你求出每个炮第一次攻击能攻击到多少个炮。

输入描述

第一行输入一个正整数n,代表炮的数量。

接下来的n行,每行输入两个整数xiyi,代表每个炮所在的坐标。

1<=n<=10^5

-10^9<=xi,yi<=10^9

输出描述

输出n行,每行输出一个整数,代表第i个炮可以攻击到的炮的数量。

样例输入

6

0 0

0 1

0 2

1 0

2 0

3 0

样例输出

2

0

1

1

1

1

参考题解

用两个map分别记录某横坐标下的所有大炮,以及某纵坐标下的所有大炮,对每个对应的vector排序,然后遍历每个炮的位置,二分找到对应下标。

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

#include <iostream>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
map<int, vector<int>> mp1, mp2;
int n;
int x[100005], y[100005], ans[100005];
int main() {
    cin>>n;
    for(int i = 1; i<=n; i++) {
        cin>>x[i]>>y[i];
        mp1[x[i]].push_back(y[i]);
        mp2[y[i]].push_back(x[i]);
    }
    for(auto it = mp1.begin(); it != mp1.end(); it++) {
        int t = it->first;
        sort(mp1[t].begin(), mp1[t].end());
    }
    for(auto it = mp2.begin(); it != mp2.end(); it++) {
        int t = it->first;
        sort(mp2[t].begin(), mp2[t].end());
    }
    for(int i = 1; i<=n; i++) {
        int pos = lower_bound(mp1[x[i]].begin(), mp1[x[i]].end(),y[i])-mp1[x[i]].begin();
        if (pos >= 2) ans[i]++;
        if(mp1[x[i]].size()- pos > 2) ans[i]++;
        pos = lower_bound(mp2[y[i]].begin(), mp2[y[i]].end(),x[i])-mp2[y[i]].begin();
        if (pos >= 2) ans[i]++;
        if(mp2[y[i]].size()- pos > 2) ans[i]++;        
    }
    for(int i = 1; i<=n; i++) cout << ans[i] << endl;
    

}
// 64 位输出请用 printf("%lld")

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

import java.util.*;
import java.io.*;

public class Main {
    // 辅助函数:实现 lower_bound,返回第一个不小于 key 的索引
    public static int lowerBound(ArrayList<Integer> list, int key) {
        int lo = 0, hi = list.size();
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            if (list.get(mid) < key) {
                lo = mid + 1;
            } else {
                hi = mid;
            }
        }
        return lo;
    }

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // 下标采用 0-indexed
        int[] x = new int[n], y = new int[n], ans = new int[n];
        // 使用 TreeMap 保证 key 有序
        TreeMap<Integer, ArrayList<Integer>> mp1 = new TreeMap<>();
        TreeMap<Integer, ArrayList<Integer>> mp2 = new TreeMap<>();
        
        for (int i = 0; i < n; i++) {
            x[i] = sc.nextInt();
            y[i] = sc.nextInt();
            // mp1: key -> list of y
            if (!mp1.containsKey(x[i])) {
                mp1.put(x[i], new ArrayList<Integer>());
            }
            mp1.get(x[i]).add(y[i]);
            // mp2: key -> list of x
            if (!mp2.containsKey(y[i])) {
                mp2.put(y[i], new ArrayList<Integer>());
            }
            mp2.get(y[i]).add(x[i]);
        }
        
        // 对 mp1 中的每个 list 排序
        for (Map.Entry<Integer, ArrayList<Integer>> entry : mp1.entrySet()) {
            Collections.sort(entry.getValue());
        }
        // 对 mp2 中的每个 list 排序
        for (Map.Entry<Integer, ArrayList<Integer>> entry : mp2.entrySet()) {
            Collections.sort(entry.getValue());
        }
        
        for (int i = 0; i < n; i++) {
            // 对应 mp1[x[i]] 的 lower_bound
            ArrayList<Integer> list1 = mp1.get(x[i]);
            int pos = lowerBound(list1, y[i]);
            if (pos >= 2)
                ans[i]++;
            if (list1.size() - pos > 2)
                an

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

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

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

全部评论
接好运
点赞 回复 分享
发布于 04-09 02:13 上海
接好运
点赞 回复 分享
发布于 04-07 01:56 上海
Mark
点赞 回复 分享
发布于 04-06 01:21 上海
代码实现很清晰
点赞 回复 分享
发布于 03-15 05:58 英国

相关推荐

3月刚开很多HC!!!!java笔试题目:用&nbsp;Python&nbsp;实现一个函数,用于计算斐波那契数列的第&nbsp;n&nbsp;项。以下&nbsp;Java&nbsp;代码片段是否存在问题?如果有,请指出并改正。简述&nbsp;C++&nbsp;中指针和引用的区别。实现一个二叉树的中序遍历算法,可使用递归或非递归方式。对于一个无序整数数组,使用快速排序算法对其进行排序,并分析该算法的时间复杂度和空间复杂度。设计一个算法,判断一个字符串是否为回文串,要求时间复杂度尽可能低。简述&nbsp;TCP&nbsp;三次握手和四次挥手的过程,并说明为什么连接建立是三次握手,而连接释放是四次挥手。一台主机的&nbsp;IP&nbsp;地址为&nbsp;192.168.1.100,子网掩码为&nbsp;255.255.255.0,它所在的网络地址和广播地址分别是什么?解释&nbsp;DNS&nbsp;的作用和工作原理。已知有两张表,学生表(student)包含字段学号(s_id)、姓名(s_name)、年龄(s_age),成绩表(score)包含字段学号(s_id)、课程号(c_id)、成绩(grade),写一个&nbsp;SQL&nbsp;语句查询年龄大于&nbsp;20&nbsp;岁的学生的姓名和他们的平均成绩。什么是数据库的事务?ACID&nbsp;特性分别代表什么含义?简述索引的作用以及在什么情况下不适合创建索引。进程和线程的主要区别是什么?在什么场景下适合使用多进程,什么场景下适合使用多线程?请描述操作系统中的页面置换算法有哪些,并简述&nbsp;LRU(最近最少使用)算法的原理。假设系统中有三个进程&nbsp;P1、P2、P3,它们分别需要资源&nbsp;R1、R2、R3,当前资源分配情况如下:P1&nbsp;占用&nbsp;R1&nbsp;并请求&nbsp;R2,P2&nbsp;占用&nbsp;R2&nbsp;并请求&nbsp;R3,P3&nbsp;占用&nbsp;R3&nbsp;并请求&nbsp;R1,请问系统是否处于死锁状态?为什么?如果是,应该如何解除死锁?二面:主要聊实习&nbsp;&nbsp;MongDB&nbsp;&nbsp;Mysql&nbsp;&nbsp;对mongdb的使用&nbsp;(只会用&nbsp;&nbsp;对存储数据的探讨&nbsp;&nbsp;定时任务生成报表&nbsp;使用分布式锁&nbsp;主意分布式时钟问题了解Dubbo吗还知道哪些数据库了解哪些新技术&nbsp;说了说推荐算法聊聊大模型&nbsp;对工作的帮助聊了聊信创&nbsp;&nbsp;&nbsp;达梦&nbsp;人大金仓数据库等给我讲了讲部门业务hr面顺丰科技25届校招内推启动!技术专场!【内推链接】https://campus.sf-express.com/m/?channel=29&amp;amp;amp;referCode=7BJ5G5#/newGraduatesList【内推码】7BJ5G5(招聘信息获取渠道选择“校园大使推荐”,加速进面,有问题随时回复~)招聘岗位:物流、供应链、大数据、算法、研发多个岗位招聘地点:深圳、武汉等即刻投递,offer速得!投递的uu留下姓名缩写+岗位♥ #春招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#实习#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#秋招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
6
28
分享

创作者周榜

更多
牛客网
牛客企业服务