美团秋招笔试五道编程题(2021-09-04)

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

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

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

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

文章目录

  • 第一道:ab串(100%)
    • 题目描述
    • 参考代码:
      • Java版本
      • CPP版本
  • 第二道:坐公交(100%)
    • 题目描述
    • 参考代码
      • CPP版本
  • 第三道:不许ac(100%)
    • 题目描述
    • 思路
    • 参考代码
      • Java版本
      • python版本
      • CPP版本
  • 第四道:四边形(100%)
    • 题目描述
    • 参考代码:
      • CPP版本(100%)
  • 第五道:滑动窗口(100%)
    • 题目描述
    • 参考代码:

第一道:ab串(100%)

题目描述

小美数学很好,小团数学不怎么好。有一天小美又在用数学题欺负小团,她提出了这样一个问题:“有多少个长度为n的仅由a和b组成的字符串既不包含aba也不包含bab?如果你算不来大数你可以告诉我这个问题的答案模上998244353是多少?”,小团实在忍不住了,所以他决定来找你帮忙。

输入描述
第一行有一个整数n(1<=n<=100000),代表小美问题中的参数。

3

输出描述
输出一个整数,即小美所问问额的答案除以998244353所得余数

6

参考代码:

Java版本

public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        while ((str = br.readLine()) != null) {
            int n = Integer.parseInt(str);
            if(n == 1 || n == 2){
                System.out.println(n == 1 ? 2 : 4);
            }else{
                int[] dp = new int[n+1];
                dp[1] = 2;
                dp[2] = 4;
                for (int i = 3; i <= n; i++) {
                    dp[i] = (dp[i-1]+dp[i-2]) % 998244353;
                }
                System.out.println(dp[n]);
            }
        }
    }
// 关注TechGuide! 大厂笔经面经闪电速递!

CPP版本

#include 
using namespace std;

const int MOD = 998244353;

int main(){
    int n = 0;
    cin >> n;
    if(n == 1){
        cout << 2 << endl;
        return 0;
    }
    if(n == 2){
        cout << 4 << endl;
        return 0;
    }
    // same表示以最后两个字母相同,diff表示不同
    int same = 2, diff = 2;
    for(int i = 3; i <= n; i++){
        int tmp = same;
        same = (same + diff) % MOD;
        diff = tmp;
    }
    int res = (same + diff) % MOD;
    cout << res << endl;
 return 0;
}
// 关注TechGuide! 大厂笔经面经闪电速递!

第二道:坐公交(100%)

题目描述

小美想坐公交去找小团玩,美团市中共有n个公交站,编号为1到n。同时也有m条公交线路,编号为1到m。小美想知道对于每一对公交站(i,j)从编号为i的站坐公交到编号为j的站至少需要乘坐几条不同的公交线路。

输入描述
第一行有两个空格隔开的整数n,m(1<=n<=500,1<=m<=500且1<=n+m<=500),代表公交站的个数和公交线路的条数。
接下来n行。每一行开头有一个整数k(1<=k<=m)。代表从这个站可以乘坐k条不同的公交线路。接下来有k个整数,代表这k条公交线路的编号,数字间用空格隔开。

输出描述
输出一个nxn的炮车,矩阵中第i行第j列的数代表从编号为i的站坐到编号为j的站至小需要乘坐多少条不同的公交线路,矩阵中每行中的元素由单个空格隔开,且行末不能有空格。

参考代码

CPP版本

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

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

第三道:不许ac(100%)

题目描述

小美天天刷题,收获了很多ac,为了纪念这些ac,小美记下了一个长度为n的仅有a和c组成的字符串。小团天天摸鱼不刷题,所以ac没有小美多。小团决定在小美睡觉的时候把小美字符串中的ac通过交换相邻两个字符全部消除。即通过一系列交换相邻字符的操作使得操作后的串中不存在ac这个字串。小团想知道他至少要交换多少次才能达成他的目的。

输入描述
第一行有一个整数n(1<=n<=100000),代表小美拥有的字符串长度
第二行有一个仅由a和c组成的字符串,代表小美的字符串。

输出描述
输出一个整数,代表小团知道的答案
如样例acca中先交换前两个字符再交换中间两个字符即可使小美的字符串变成ccaa.

思路

参考代码

Java版本

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=Integer.parseInt(in.nextLine());
        String input=in.nextLine();
        int[] dp=new int[n+1];
        char[] c=input.toCharArray();
        int indexa=0;
        if(c[0]=='a')
            indexa=1;
        for(int i=2;i<=n;++i){
            if(c[i-1]=='c'&&c[i-2]=='a'){
                    dp[i] = dp[i-1] + i - indexa;
                    indexa++;
                    c[i-1]='a';
                    c[i-2]='c';
            }
            else{
                if(c[i-1]=='a'&&indexa==0){
                    indexa=i;
                }
                dp[i]=dp[i-1];
            }
        }
        System.out.println(dp[n]);
    }
}

python版本

n=int(input())
nums=input()
res=0
while True:
    count = nums.count('ac')
    if count==0:
        break
    res += count
    newnums = nums.replace('ac', 'ca', 100000)
    nums=newnums
print(res)
# 关注TechGuide! 大厂笔经面经闪电速递!

CPP版本

#include 
#include 
using namespace std;

int main(){
    int n = 0;
    cin >> n;
    string str;
    cin >> str;
    int idx = n - 1;
    long long res = 0;
    for(int i = n - 1; i >= 0; i--){
        if(str[i] == 'a'){
            res += (idx - i);
            idx--;
        }
    }

    cout << res << endl;
    return 0;
}
// 关注TechGuide! 大厂笔经面经闪电速递!

第四道:四边形(100%)

题目描述

小美有一张无向器。特别会数数的小团册拿个难题考一下小美,于是他决定询问小美这张无向图中有多少个不同的四边形、无向图中的四边形由四个不同的点a,b,c,d和四条属于这张无向图的边(a,b)(b,c)(c,d)(d,a)组成,若两个四边形的点集和边集相同,则我们认为这两个四边形是同一个四边形,小美的这张无向图有点大,她期望你帮她算出这个难题的答案。

输入描述

第一行有一个整数n代表这张无向图中的点数。
接下来n行给出这张无向图的邻接矩阵,每行有n个由空格隔开的整数,每个整数的值为0或1。
输入保证对角元为0,即这张图没有自环。

6
011100
101010
110001
100011
010101
001110

输出描述

输出一个整数,代表这张无向图中有多少个不同的四边形。

3

参考代码:

CPP版本(100%)

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

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

第五道:滑动窗口(100%)

题目描述

给一个数组 给一个范围,然后去掉范围内最高最低求均值,叫切尾平均,找切尾平均最高的是哪一组。

核心是在给定一个数组 nums 和滑动窗口的大小 k时,求出最大值、最小值和前缀和,可以参考剑指59《滑动窗口最大值》。

链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/

参考代码:

import java.util.ArrayDeque;
import java.util.Scanner;

public class TechGuide {
    static int[] input;

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int m = s.nextInt();
        input = new int[n];
        for (int i = 0; i < n; i++) {
            input[i]=s.nextInt();
        }
        System.out.println(solve(input,n,m)+1);
    }

    private static int solve(int[] input, int n, int m) {
        ArrayDeque<Integer> maxIndex = new ArrayDeque<>();
        ArrayDeque<Integer> minIndex = new ArrayDeque<>();

        int resIndex = 0;
        long curSum = 0;
        for (int i = 0; i < m; i++) {
            curSum=curSum+input[i];
            putInto(maxIndex,minIndex,i);
        }
        long afterSum = curSum-findMax(maxIndex,0)-findMin(minIndex,0);
        long maxSum = afterSum;

        for(int j = m ; j < n ; j++){
            int i = j-m;//i退出,j进入
            curSum=curSum-input[i]+input[j];
            putInto(maxIndex,minIndex,j);
            afterSum=curSum-findMax(maxIndex,i+1)-findMin(minIndex,i+1);
            if(afterSum>maxSum){
                maxSum=afterSum;
                resIndex=i+1;
            }
        }
        return resIndex;
    }

    private static long findMin(ArrayDeque<Integer> minIndex, int i) {
        while(minIndex.peekFirst()<i){
            minIndex.pollFirst();
        }
        return input[minIndex.peekFirst()];
    }

    private static long findMax(ArrayDeque<Integer> maxIndex, int i) {
        while(maxIndex.peekFirst()<i){
            maxIndex.pollFirst();
        }
        return input[maxIndex.peekFirst()];
    }

    private static void putInto(ArrayDeque<Integer> maxIndex, ArrayDeque<Integer> minIndex, int i) {
        int toPut = input[i];
        while(!maxIndex.isEmpty() && toPut>=input[maxIndex.peekLast()]){
            maxIndex.pollLast();
        }
        maxIndex.addLast(i);

        while(!minIndex.isEmpty() && toPut<=input[minIndex.peekLast()]){
            minIndex.pollLast();
        }
        minIndex.addLast(i);

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

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

你可能感兴趣的:(大厂编程题,算法,c++,线性代数,java)