2020美团秋招笔试题解

1. T1

问题:

小团深谙保密工作的重要性,因此在某些明文的传输中会使用一种加密策略,小团如果需要传输一个字动串S,则他会为这个字符串添加一个头部字符串和一个尾部字符串。头部字符用满足至少包含一个“MT 子序列,且以T结尾。尾部字符串需要满足至少包含一MT 序列,且以M开头。例如AAAMT和MAAAT都是一个合法的头部字符串,而MTAAA就不是合法的头部字符串。很显然这样的头尾字符串并不-定是唯一的,因此我们还有一个约束,就是S是满足头尾字符串合法的情况下的最长的字符串。很显然这样的加密策略是支持解码的,给出你—个加密后的字符串,请你找出中间被加密的字符串S。

输入:

加密字符串

输出:

最长可能加密前字符串

思路:

用find和rfind找位置

代码:

def T1(s):
    substr = s[s.find("M")+1:]
    substr = substr[substr.find("T")+1:]
    substr = substr[:substr.rfind("T")]
    substr = substr[:substr.rfind("M")]
    return substr

2. T2

问题:

美团打算选调n名业务骨干到n个不同的业务领域,本着能者优先的原则,公司将这n个人按照业务能力从高到低编号为1-n。编号靠前的人具有优先选择的权力,每个人都会填写一个意向。这个意向是一个1-n的排列,表示一个人希望去的业务区域顺序,如果有两个人同时希望去某个业务区域则优先满足编号小的人,每个人最终只能去一个业务区域。
求解,每个人最终去的区域

输入:

输入第一行是一个正整数n,表示业务骨干和业务区域数量。(n<=300)
接下来n行,每行n个数,第i行表示i号业务员的意向顺序

输出:

n个正整数,第i个正整数表示第i号业务骨干最终去的业务区域。

思路:

用set存储已经被选择的业务。

代码:

def T1(n, arr):
    workset = set()	# 维护被选择的业务
    result = []				#输出
    for i in arr:
        for j in i:
            if j in workset:
                continue
            else:
                workset.add(j)
                result.append(j)
                break
    return result

3. T3

问题:

小团惹小美生气了,小美要去找小团“讲道理”。小团望风而逃,他们住的地方可以抽象成一棵有n个结点的树,小美位于x位置,小团位于y位置。小团和小美每个单位都可以选择不动或者向相邻位置移动,假设小美足够聪明,显然小团会无路可逃,只能延缓一下呗讲道理的时间。请问最多经过多少个单位时间后,小团会被追上。

输入:

输入第一行包括三个整数,n, x, y, 分别表示树上的结点数量,小美所在的位置和小团所在的位置。(1 <= n <= 50000)
接下来n-1行,每行两个整数u, v,表示u号位置和v号位置之间有一条边,即u和v彼此相连。

输出:

输出仅包含一个整数,表示小美追上小团所需的时间。

思路:

分别以x、y为根节点进行深度优先遍历,计算根节点距离其它节点的距离。
由题目,disx必然比disx大(x追赶y),聪明的小团会让距离变得尽量大(max)

代码:

def dfs(nodelist, dis, start, equl, step):
   for v in nodelist[start]:
       if v == equl:
           continue
       dis[v] = step + 1
       dfs(nodelist, dis, v, start, step + 1)


def T3(n, x, y, arr):
   nodedict = {}
   for i in range(1, n+1):
       nodedict[i] = []
   for i in arr:
       nodedict[i[0]].append(i[1])
       nodedict[i[1]].append(i[0])
   disx = [0 for i in range(n+1)]
   disy = [0 for i in range(n+1)]
   dfs(nodedict, disx, x, -1, 0)
   dfs(nodedict, disy, y, -1, 0)
   ans = 0
   print(disx)
   print(disy)
   for i in range(1, n+1):
       if disx[i] > disy[i]:
           ans = max(disx[i], ans)
   return ans

4. T4

问题:

小团和小美各自选择一个[1,m]之间的整数,设小美选择的是l,小团选择的是r,我们认为两个人是默契的需要满足以下条件:

  1. l 小于等于r。
  2. 对于序列中的元素x,如果0<x<l,或r<x<m+1,则x按其顺序保留下来,要求保留下来的子序列单调不下降。
    小团为了表现出与小美最大的默契,因此事先做了功课,他想知道能够使得两人默契的二元组<l,r>一共有
    多少种。 我们称一个序列A为单调不下降的,当且仅当对于任意的i>j,满足A_i>=A_j。 输入第一行包含
    两个正整数m和n,表示序列元素的最大值和序列的长度。(1<=n,m<=100000)

输入:

输入第一行包含两个正整数m和n,表示序列元素的最大值和序列的长度。(1<= n, m<= 100000)
输入第二行包含n个正整数,表示该序列

输出:

输出仅包含一个整数,表示满足条件的二元组数量。

分析:

暴力解法。首先统计所有元组的可能性和对应数量,
例如 [4, 1, 4, 1, 2] -> {‘4.4’: 2, ‘1.4’: 4, ‘1.1’: 2, ‘1.2’: 2, ‘2.4’: 2}
然后遍历元组判读是否符合单调不下降的条件。

代码:

def T4(n, m, order):
    usedset = {}
    for i in range(n):
        for j in range(n):
            if order[i] <= order[j] and j != i:
                tmp = str(order[i])+"."+str(order[j])
                if tmp in usedset:
                    usedset[tmp] += 1
                else:
                    usedset[tmp] = 1
    ans = 0
    for k in usedset.keys():
        strarr = k.split(".")
        l, r = int(strarr[0]), int(strarr[1])
        flag = True
        ordertmp = []
        for i in range(n):
            if order[i] not in range(l, r+1):
                ordertmp.append(order[i])
        for i in range(len(ordertmp)-1):
            if ordertmp[i] > ordertmp[i+1]:
                flag = False
                break
        if flag:
            ans += usedset[k]
    return ans
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值