美团秋招笔试四道编程题(2021-08-29)

通知:最新的秋招笔试编程题题目、思路以及参考代码已经全部整理好放在【TechGuide】了,私信公众号回复【美团】或者【字节】即可获得最实时的笔试题解啦!

第一道:丁香树(100%)

题目描述

小团每天都会走过一条路去上课。这条路旁种有丁香树,从左向右排成一排并编号为1…n。又是一年一度的丁香季,所有丁香都开花了,第i棵丁香树的芳香值为ai,小团要从第一棵丁香树走到最后一棵。当走到第i棵丁香树时,如果这棵丁香树的芳香值比之前经过的i-1棵丁香树中棵的芳香值高,她的满意度就要加上那x棵丁香树的不同的芳香值个数。
小团知道了这n程丁香树的芳香值,她想知道走过这n棵工香树后自己的满音度是多少。

输入描述
第一行一个正整数n,为丁香树数目:
第二行n个致ai第i个数代表第i棵丁香树的芳香度。对于10%的数据,n<=100;

16
1122233331

输出描述
一行一个整数,表示小团的满意度,

11

提示

当走到第34。5棵丁香树时,因为它们的芳香值为2,大于前两棵丁香树的芳香值1,因为只有一种芳香值,所以经过3、4、5 中的每棵树都会产生1的满意度,总满意度累计为 3;

当走到第67,8,9棵丁香树时,因为它们的芳香值为3,大于前面两种芳香值12,所以经过6,7,8,9中的每棵树都会产生2的满意度,总满意度累计为 8;

综上,一共会产生11点满意度。

参考代码:

Python版本

import sys
n = int(sys.stdin.readline().strip(' ').strip('\n').strip(' '))
arr = list(map(int,sys.stdin.readline().strip(' ').strip('\n').strip(' ').split(' ')))
record = {}
res =0
for i in range(len(arr)):
    if arr[i] not in record:
        record[arr[i]]=0
    record[arr[i]] +=1
    for key in record:
        if key< arr[i]:
            res+= 1
print(res)
# 关注TechGuide! 大厂笔经面经闪电速递!

Go版本

# 排序然后逆序遍历就行了
func main(){
 var n int
 fmt.Scan(&n)
 book := make([]int,n)
 for i := range book{
  fmt.Scan(&book[i])
 }
 deck := make([]int,n)
 for i := range deck{
  fmt.Scan(&deck[i])
 }
 sort.Ints(book)
 sort.Ints(deck)
 ans := 1
 idx := n - 1
 ideck := n - 1
 for idx >= 0{
  for ideck >= 0 && deck[ideck] >= book[idx]{
   ideck--
  }
  ans = (ans * (n - ideck - 1 - (n - idx - 1))) % (1e9 + 7)
  idx--
 }
 fmt.Println(ans)
}
// 关注TechGuide! 大厂笔经面经闪电速递!

第二道:整理书架(100%)

题目描述

小美在整理她的书。
她有n本书要放,书架上也有n个位面可以放书。每本书都有一个厚度a,可以放书的每个位置都有一个宽度b。小美不想让书折环,因此只有在满足ai<=bi的情况下,第i本书才可以放到第j个位置,否则不可以放。小美想知道有多少种放书的方案。

输入描述
第一行一个整数n,表示有n本书,同时有n个位置。
第二行n个整数,表示每本书的厚度ai
第三行n个整数,表示每个可以放书位置的宽度bi,数据保证所有书可以返回书架

输出描述
输出一行一个整数,表示放书方案的种类数,由于这个方案数很大,话对10^9+7取模后输出。

参考代码

CPP版本

int n;
    cin >> n;
    vector<ll> a(n);
    vector<ll> b(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> b[i];
    }
    sort(a.rbegin(), a.rend());
    sort(b.begin(), b.end());
    ll res = 1;
    const int mod = 1e9 + 7;
    for (int i = 0; i < n; i++) {
        int target = a[i];
        auto it = lower_bound(b.begin(), b.end(), target);
        if (it == b.end()) {
            cout << -1 << endl;
            return 0;
        }
        res *= (n - i) - (it - b.begin());
        res %= mod;
    }
    cout << res << endl;
// 关注TechGuide! 大厂笔经面经闪电速递!

Python版本

import sys
from bisect import bisect_right,bisect_left
n = int(sys.stdin.readline().strip(' ').strip('\n').strip(' '))
arra = list(map(int,sys.stdin.readline().strip(' ').strip('\n').strip(' ').split(' ')))
arrb = list(map(int,sys.stdin.readline().strip(' ').strip('\n').strip(' ').split(' ')))

arra = sorted(arra,reverse=True)
arrb = sorted(arrb)
mode = int(1e9+7)
res = 1
for i in range(n):
    flag = arra[i]
    idx = bisect_left(arrb,flag)
    tres = n-idx -i
    if tres<=0:
        res = 0
        break
    res = (res*tres)%mode
print(res)
# 关注TechGuide! 大厂笔经面经闪电速递!

第三道:文件流(100%)

题目描述

小团最近在学习操作系统。
文件流是操作系统中一个重要的概念。在Linux操作系统中,/dev/random和/dev/urandom是两个重要的设备,它们可以提供永不为空的随机宇节数据流。在这里,流是不能回退的。
小团自己也实现了一个类似于/dev/random的设备/dev/crandom,但是它只能提供预先设定好但循环不断的某个由随机小写字母组成的字符出。比如这个随机宇符串为 meitun,那么这个设备会提供永不为空的宇符串流meinammeitanmeit…
小团想利用这个设备生成一段由小写英文字母组成的文宇,但她想知道恰好生成完这段文字时,浪费了这个流的多少个字符。

输入描述
第一行一个长为n的字符串s,表示这个循环出现的随机字符串。
第二行一个长为m的字符串a,表示小团相要生成的宇符串。
对于另外20%的数据,保证s中ASCII码大的字母均出现在AscII码小的字母之后
保证字符串s与a只包含小写英文字母

输出描述
输出一行一个整数,如果不能生成字符串a,则输出-1,否则输出恰好生成完这个字符串时,浪费了这个流的多少个字符。

思路

参考代码

import sys
s = sys.stdin.readline().strip(' ').strip('\n').strip(' ')
a = sys.stdin.readline().strip(' ').strip('\n').strip(' ')

records = []
record = {}
for i in range(len(s)-1,-1,-1):
    record[s[i]] = i
    records.append(record.copy())
records = records[::-1]

flag = False
for c in a:
    if c not in record:
        flag= True
        break

if flag:
    print(-1)
else:
    res = 0
    n = len(s)
    idx = 0
    i= 0
    while i<len(a):
        c = a[i]
        if idx>=n :
            idx = 0
            continue
        trecord = records[idx]
        if c not in trecord:
            res += (n- idx)
            idx = 0
            continue
        next_idx = trecord[c]
        res += (next_idx-idx)
        idx = next_idx+1
        i+=1
    print(res)
# 关注TechGuide! 大厂笔经面经闪电速递!

第四道:收割(100%)

题目描述

小美老家有地,这些地块形成了一个树形结构,有n块地由n-1条可双向通行的道路连接,使得这n块地连通,这n块地编号为1到n小美总位于1号地块。
现在小美要收割地里的收成,她有一台性能很强的收割机,可以沿着道路连续收割地块。但是正因为性能很强,所以收割速度太快,就导致工作时不能转向。也就是说,小美只能从1号地块出发,沿某条路径收割,直到一个叶子节点停止。
但是有些地块里有大石头,可能会导致收割机损坏。如果连续经过了大于m块有石头的地块,收割机就会损坏。所以小美想知道,有多少条从1号地块出发,到达某个叶子节点的路径能够使得收割过后她的收割机不损坏。

输入描述

第一行两个整数n,m,意义如题目描述。
第二行n个整数pi,p如果是0,则代表i号地块没有石头,如果是1,则代表有石头。
第三行n-1个整数fi,表示(i+1,f)之间有一条可双向通行的道路相连。

参考代码:

CPP版本(36%)

#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <queue>
using namespace std;

const int maxn = 1005,maxm = 1005;
int book[maxn][maxm];

int main() {
    int n,m,k,res=0;
    cin>>n>>m>>k;
    int x,y,r;
    for (int i = 1; i <n+1 ; ++i) {
        for (int j = 1; j <m+1 ; ++j) {
            book[i][j] =1;
        }
    }
//    vector<vector<int> >book(n+1, vector<int>(m+1,1));
    for (int tt = 0; tt < k; ++tt) {
        cin>>x>>y>>r;
        for (int i = 1; i <n+1 ; ++i) {
            for (int j = 1; j <m+1 ; ++j) {
                if ((i-x)*(i-x)+(j-y)*(j-y)<= r*r){
                    book[i][j] =0;
                }
            }
        }
        if (tt!=k-1){
            for (int i = 1; i <n+1 ; ++i) {
                for (int j = 1; j <m+1 ; ++j) {

                    book[i][j] +=1;

                }
            }
        }
    }
    for (int i = 1; i <n+1 ; ++i) {
        for (int j = 1; j <m+1 ; ++j) {
            res+=book[i][j];

        }
    }
    cout<<res;
    return 0;
}

// 关注TechGuide! 大厂笔经面经闪电速递!

恭喜发现宝藏!微信搜索公众号【TechGuide】关注更多新鲜好文和互联网大厂的笔经面经。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2023年3月11日,美团春季招聘笔试中共包含五道编程题目。以下是对每道题目的简要说明: 1. 题目一:这道题目要求解决一个数字统计的问题。可能涉及到的知识点包括数据结构、循环和条件判断等。解决问题的思路可能是使用字典等数据结构来保存统计结果,并使用循环逐个读取输入数据并进行统计。 2. 题目二:这道题目可能是一个字符串处理的问题。需要使用字符串的方法进行操作,如提取、拼接、查找和替换等。可能的解决思路包括使用正则表达式、切片和遍历等。 3. 题目三:这道题目可能涉及到算法和数据结构的知识。可能是一道涉及到数组、链表、树等数据结构的问题。解决思路可能包括遍历、递归、搜索和排序等。 4. 题目四:这道题目可能是一个动态规划的问题。需要根据给定的条件和规则,通过动态规划的方式求解问题。解决思路包括定义状态和转移方程,使用递推或记忆化搜索进行求解。 5. 题目五:这道题目可能是一个图论或网络问题。需要根据给定的图或网络结构,解决一个相关的问题。可能涉及到广度优先搜索、深度优先搜索、最短路径等知识。解决思路可能包括使用图或网络的相关算法进行求解。 以上只是对这五道编程题目的一些可能情况进行的简要描述,具体的题目内容可能会有所不同。希望这些信息能对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值