2025届美团秋招笔试题

题型及时间

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”。

参考答案

n = int(input()) 
s = input() 
mem =[]
a,b=00
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))
<think>好的,我现在需要解决小美彩带Python题解。首先,我得仔细理解题目要求,确保自己正确理解了问题。题目是关于彩带的,可能涉及到彩带的长度、颜色分配,或者是某种排列组合的问题。不过因为用户没有给出具体的题目描述,我需要先假设一个常见的类似问题,例如:小美有一条彩带,由多个不同颜色的部分组成,可能需要找出最长的连续子段满足某种条件,比如颜色交替出现或者某种颜色出现的次数最多等。 假设题目是这样的:给定一个字符串表示的彩带,每个字符代表一种颜色,找出其中最长的连续子串,使得该子串中没有重复的颜色。这是LeetCode上经典的“最长无重复字符子串”问题,可能用户提到的就是类似的问题。如果是这样的话,解决方法通常是使用滑动窗口(双指针)来维护一个不含重复字符的窗口,记录最大长度。 接下来,我需要确认题目的具体要求。比如,是否区分大小写,是否有其他约束条件。但假设是标准的情况,那么思路就是用两个指针,一个左指针和一个右指针,右指针不断右移,当遇到重复字符时,左指针移动到重复字符的下一个位置,同时记录窗口的最大长度。在这个过程中,需要一个哈希表或者字典来记录每个字符最后出现的位置,以便快速判断是否有重复,并调整左指针的位置。 现在,我需要用Python来实现这个算法。首先初始化左指针为0,最大长度为0,创建一个字典来保存字符的最新索引。然后遍历字符串的每个字符,索引为右指针。如果当前字符已经在字典中,并且其位置大于等于左指针,说明这个字符在当前窗口内重复了,所以需要将左指针移动到该字符上次出现位置的下一个位置。然后更新字典中当前字符的位置为当前右指针的位置。计算当前窗口的长度(右指针-左指针+1),并更新最大长度。 例如,输入字符串是"abcabcbb",那么输出应该是3,对应"abc"。另一个例子,"bbbbb"的最长无重复子串长度是1。 编写代码的时候需要注意,字典的初始值可能需要处理字符不存在的情况。同时,左指针只能向右移动,不能回退,所以每次更新左指针的时候要取最大值,即max(left, seen[char] + 1)。这样才能确保左指针不会因为之前的重复字符而错误地左移。 另外,测试一些边界情况,比如空字符串、所有字符都相同的情况、或者所有字符都不同的情况,确保代码的鲁棒性。 最后,将整个思路整理成步骤清晰的解释,并给出完整的Python代码,确保语法正确,并且有适当的注释,帮助用户理解。同时,需要验证示例的正确性,确认代码的正确性。</think>小美彩带问题通常涉及在彩带(字符串)中找到满足特定条件的最长子串。以下是一个常见的题解思路及Python实现,假设题目要求**找到最长的无重复字符子串**: --- ### **问题分析** 给定一个字符串表示彩带颜色,要求找到**最长连续子串**,使得该子串中没有重复的颜色字符。 **示例**: - 输入:`"abcabcbb"` → 输出:`3`(最长子串`"abc"`) - 输入:`"bbbbb"` → 输出:`1`(最长子串`"b"`) --- ### **算法思路:滑动窗口** 1. **双指针定义**: - `left`指针标记窗口左边界,`right`指针遍历字符串。 - 窗口范围:`[left, right]`。 2. **哈希表记录**: - 使用字典`seen`记录每个字符最后一次出现的索引。 3. **窗口更新规则**: - 当`right`遇到重复字符时,将`left`移动到重复字符的下一个位置。 - 始终保持窗口内无重复字符。 --- ### **Python代码实现** ```python def longest_unique_substring(s: str) -> int: seen = {} # 记录字符最后一次出现的索引 max_length = 0 # 最大子串长度 left = 0 # 滑动窗口左边界 for right in range(len(s)): char = s[right] # 如果字符已存在且在窗口内,移动左边界 if char in seen and seen[char] >= left: left = seen[char] + 1 # 更新字符的索引 seen[char] = right # 计算当前窗口长度并更新最大值 current_length = right - left + 1 max_length = max(max_length, current_length) return max_length ``` --- ### **代码解析** 1. **初始化**: - `seen`字典保存字符的最新位置。 - `max_length`记录结果,`left`初始化从0开始。 2. **遍历字符串**: - 对每个字符`char`,检查是否在窗口内重复。 - 若重复,将`left`移动到重复字符的下一位。 3. **更新与计算**: - 更新`char`的最新位置到`seen`。 - 计算当前窗口长度`current_length = right - left + 1`。 - 通过`max()`更新`max_length`。 --- ### **复杂度分析** - **时间复杂度**:$$O(n)$$,仅需一次遍历。 - **空间复杂度**:$$O(1)$$,假设字符集为ASCII(最多256个键值对)。 --- ### **测试示例** ```python print(longest_unique_substring("abcabcbb")) # 输出: 3 print(longest_unique_substring("bbbbb")) # 输出: 1 print(longest_unique_substring("pwwkew")) # 输出: 3("wke"或"kew") ``` 此算法能高效解决彩带类最长无重复子串问题,适用于大部分字符串处理场景。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天不coding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值