LeetCode—美团2021秋招 006、007、008、009

美团2021秋招 006 小团的神秘暗号、007 小团的选调计划、008 小团无路可逃、009 小团的装饰物

题目描述:
[006]
小团深谙保密工作的重要性,因此在某些明文的传输中会使用一种加密策略,小团如果需要传输一个字符串 S ,则他会为这个字符串添加一个头部字符串和一个尾部字符串。头部字符串满足至少包含一个 “MT” 子序列,且以 T 结尾。尾部字符串需要满足至少包含一个 “MT” 子序列,且以 M 开头。例如 AAAMT 和 MAAAT 都是一个合法的头部字符串,而 MTAAA 就不是合法的头部字符串。很显然这样的头尾字符串并不一定是唯一的,因此我们还有一个约束,就是 S 是满足头尾字符串合法的情况下的最长的字符串。
很显然这样的加密策略是支持解码的,给出一个加密后的字符串,请你找出中间被加密的字符串 S 。
[007]
美团打算选调 n 名业务骨干到 n 个不同的业务区域,本着能者优先的原则,公司将这 n 个人按照业务能力从高到底编号为 1~n 。编号靠前的人具有优先选择的权力,每一个人都会填写一个意向,这个意向是一个 1~n 的排列,表示一个人希望的去的业务区域顺序,如果有两个人同时希望去某一个业务区域则优先满足编号小的人,每个人最终只能去一个业务区域。
例如 3 个人的意向顺序都是 1 2 3 ,则第一个人去 1 号区域,第二个人由于 1 号区域被选择了,所以只能选择 2 号区域,同理第三个人只能选择 3 号区域。
最终请你输出每个人最终去的区域。
[008]
小团惹小美生气了,小美要去找小团“讲道理”。小团望风而逃,他们住的地方可以抽象成一棵有n个结点的树,小美位于 x 位置,小团位于 y 位置。小团和小美每个单位时间内都可以选择不动或者向相邻的位置转移,很显然最终小团会无路可逃,只能延缓一下被“讲道理”的时间,请问最多经过多少个单位时间后,小团会被追上。
[009]
小团正在装饰自己的书桌,他的书桌上从左到右有 m 个空位需要放上装饰物。商店中每个整数价格的装饰物恰好有一种,且每种装饰物的数量无限多。
小团去商店的时候,想到了一个购买方案,他要让右边的装饰物价格是左边的倍数。用数学语言来说,假设小团的 m 个装饰物价格为 a[1], a[2], …, a[m] ,那么对于任意的 1≤i≤j≤m ,a[j] 是 a[i] 的倍数。
小团是一个节约的人,他希望最贵的装饰物不超过 n 元。现在,请你计算小团有多少种购买的方案?

第006题

import java.util.*;

public class test {

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String s = scan.next();
        char[] ss = s.toCharArray();
        int i = 0,j = ss.length - 1;
        int leftB = i, rightB = j;
        boolean left = true, right = true;
        for(;i < ss.length && !(!right && !left);i ++, j--){
            if(ss[j] == 'T' && right){
                right = false;
                while(j < ss.length && ss[j] != 'M'){j --;}
                rightB = j;
            }
            if(ss[i] == 'M' && left){
                while(i < ss.length && ss[i] != 'T'){i ++;}
                left = false;
                leftB = i+1;
            }
        }
        System.out.println(s.substring(leftB, rightB));
    }

}

第007题

import java.util.*;

public class test {

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        boolean[] pos = new boolean[n];
        for(int i = 0;i < n;i ++){
            for(int j = 0;j < n;j ++){
                int target = scan.nextInt();
                if(!pos[target - 1]){
                    pos[target - 1] = true;
                    System.out.print(target + " ");
                    while(++j < n){  scan.nextInt(); }
                }
            }
        }
        System.out.println();
    }

}

第008题

import java.util.*;

public class test {

    public static void dfs(int nowPos, List<List<Integer>> edges, int[] recCount, boolean[] visit, int count){
        List<Integer> nowWay = edges.get(nowPos);
        recCount[nowPos] = count;
        for(int i = 0;i < nowWay.size();i ++){
            int next = nowWay.get(i);
            if(visit[next])
                continue;
            visit[next] = true;
            dfs(next, edges, recCount, visit, count + 1);
            visit[next] = false;
        }
    }

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        List<List<Integer>> edges = new ArrayList<>();
        int n = scan.nextInt();
        int mei = scan.nextInt()-1;
        int tuan = scan.nextInt()-1;
        for(int i = 0;i < n;i ++){
            edges.add(new ArrayList<>());
        }
        for(int i = 0;i < n - 1;i ++){
            int start = scan.nextInt() - 1;
            int end = scan.nextInt() - 1;
            edges.get(start).add(end);
            edges.get(end).add(start);
        }
        int[] recMei = new int[n];
        int[] recTuan = new int[n];
        int res = 0;
        boolean[] visit = new boolean[n];
        visit[mei] = true;
        dfs(mei, edges, recMei, visit, 0);
        visit[mei] = false;
        visit[tuan] = true;
        dfs(tuan, edges, recTuan, visit, 0);
        for(int i = 0;i < n;i ++){
            if(recMei[i] > recTuan[i]){
                res = Math.max(recMei[i], res);
            }
        }
        System.out.println(res);
    }

}

第009题

import java.util.*;

public class test {

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        List<List<Integer>> edges = new ArrayList<>();
        int n = scan.nextInt();
        int m = scan.nextInt();
        int mod = 998244353;
        int[][] dp = new int[m+1][n+1];     // dp[i][j]  第i个空位,价格为j时的可能情况
        for(int i = 1;i <= n;i ++){
            dp[1][i] = 1;
        }
        for(int i = 2;i <= m;i ++){     //统一从1开始计数
            for(int j = 1;j <= n;j ++){
                for(int k = j;k <= n;k += j){
                    dp[i][k] = (dp[i][k] + dp[i - 1][j]) % mod; //防止在这里就越界
                }
            }
        }
        int res = 0;
        for(int i = 1;i <= n;i ++){
            res = (res + dp[m][i]) % mod;
        }

        System.out.println(res);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ostrich5yw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值