2025届美团秋招笔试题

今天不coding 2024-08-31 08:05:02 阅读 94

题型及时间

90分钟

单选10 + 算法3

单选包括Java基础八股文、设计模式、计算机网络、sql语句

算法

1

题目描述

小美准备登录美团,需要输入密码,小美忘记了密码,只记得密码可能是n 个字符串中的一个。小美会按照密码的长度从小到大依次尝试每个字符串,对于相同长度的字符串,小美随机尝试,并且相同的密码只会尝试一次。小美想知道,她最少需要尝试多少次才能登录成功,最多需要尝试多少次才能登录成功。小美不会重新尝试已经尝试过的字符串。成功登录后会立即停止尝试。

输入描述

第一行输入一个整数 n(1< n < 1000)代表密码字符串的个数。

第二行输入一个只由小写字母组成的字符串s(1 <|s| <1000)代表正确的密码。

接下来 n行,每行输入一个长度不超过 1000.的字符串,代表小美记得的密码。

输出描述

在一行上输出两个整数,表示最少和最多尝试次数。

输入示例

4

ab

abc

ab

ac

ac

输出示例

1 2

说明

小美可能按照[“ab”“ac”"abc” 的顺序尝试,第一次尝试成功,也可能按照[“ac”,“ab”,“abc] 的顺序尝试,第二次尝试成功。小美在尝试"ac"发现不正确后不会继续尝试"ac”。

参考答案

<code>n = int(input())

s = input()

mem =[]

a,b=0,0

for _ in range(n):

ts = input()

if ts in mem:

continue

mem.append(ts)

if len(ts) < len(s) or ts == s:

a += 1

elif len(ts) == len(s):

b += 1

print(a, a+b)

2

题目描述

小美有一个长度为九 的数组 ai,a2,…,an,他可以对数组进行如下操作:

删除第一个元素 a1,同时数组的长度减一,花费为 x。

删除整个数组,花费为k x MEX(a) (其中MEX(a)表示a 中未出现过的最小非负整数。

例如[0,1,2,4]的MEX为3)。

小美想知道将a 数组全部清空的最小代价是多少,请你帮帮他吧。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数T(1< T < 1000)代表数据组数,每组测试数据描述如下:

第一行输入三个正整数n,k,x (1 <n <2 x 10^5, 1< k,x < 10 ^9)代表数组中的元素数量、删除整个数组的花费系数、删除单个元素的花费。第二行输入n 个整数 a1,a2,…,an (0 < ai ≤ n),表示数组元素。

除此之外,保证所有的n 之和不超过 2 x 10^5。

输出描述

对于每一组测试数据,在一行上输出一个整数表示将数组中所有元素全部删除的最小花费。

输入示例

1

6 3 3

4 5 2 3 1 0

输出示例

15

说明

若不执行操作一就全部删除,

MEX{4,5,2,3,1,0}=6,花费 18;

若执行-次操作一后全部删除,

MEX{5,2,3,1,0}=4,花费3+12;

若执行两次操作一后全部删除,MEX{2,3,1,0]=4,花费6+12;

若执行三次操作一后全部删除,MEX{3,1,0}= 2,花费9+6;

若执行四次操作一后全部删除,MEX{1,0}= 2,花费 12+6;

若执行五次操作一后全部删除,MEX{0}= 1,花费15+3;

若执行六次操作一,MEX= 0,花费18;

参考答案

def min_cost_to_clear(n, k, x, arr):

dp = [0] * (n + 1)

dp[n] = x * n

mex = 0

res = float('inf')

p = 0

record = { }

for i in range(n - 1, -1, -1):

p += 1

while arr[i] == mex or mex in record:

mex += 1

record[arr[i]] = 1

dp[i] = x * (n - p) + mex * k

if dp[i] < res:

res = dp[i]

return res

T = int(input())

results = []

for _ in range(T):

n, k, x = map(int, input().split())

arr = list(map(int, input().split()))

result = min_cost_to_clear(n, k, x, arr)

results.append(result)

for res in results:

print(res)

3

题目描述

小美的彩带是由一条长度为 九 的彩带一直无限循环得到的,彩带的每一个位置都有一个颜色,用ai表示。因此当i>n时,ai=ai-n。小美每次会从左往后或从右往左剪一段长度为 2 的彩带,她想知道她每次剪下来的彩带有多少种颜色。

输入描述

第一行输入两个整数n,q(1 ≤n,q<2x 105)代表彩带长度、剪彩带次数。

第二行输入n 个整数al,a2,…,an (1 ≤ ai ≤ 10°)代表彩带每一个位置的颜色。

此后 q 行,每行输入一个字符 c和一个整数x(1 <x < 10°;c E’L’,"R)代表裁剪方向和裁剪长度,其中工"说明从左往右剪,"R 说明从右往左剪。

输出描述

对于每一次裁剪彩带,在一行上输出一个整数代表颜色数量。

输入示例

6 3

1 1 4 5 1 4

L 2

L 3

R 12

输出示例

1

3

3

说明

第一次剪彩带,剪下来的是[1,1],有《1]这1种颜色,

第二次剪彩带,剪下来的是 [4,5,1],有

{1,4,5}这3种颜色;第三次剪彩带,剪下来的是[1,1,4,5,1,4,1,1,4,5,1,4,有{1,4,5}这3种颜色。

参考答案

n, q = map(int, input().split())

arr = list(map(int, input().split()))

l, r = 0, len(arr) - 1

for _ in range(q):

c, x = tuple(input().split())

x = int(x)

if c == 'L':

tl, tr = l, l + x - 1

l = l + x

else:

tl, tr = l - x + 1, r

r = l - x

tset = set()

for idx in range(tl, tr + 1):

tset.add(arr[idx])

print(len(tset))



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。