目录
美团2021校招第10场
第1题
某比赛已经进入了淘汰赛阶段,已知共有n名选手参与了此阶段比赛,他们的得分分别是a_1,a_2….a_n,小美作为比赛的裁判希望设定一个分数线m,使得所有分数大于m的选手晋级,其他人淘汰。
但是为了保护粉丝脆弱的心脏,小美希望晋级和淘汰的人数均在[x,y]之间。
显然这个m有可能是不存在的,也有可能存在多个m,如果不存在,请你输出-1,如果存在多个,请你输出符合条件的最低的分数线。
数据范围:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StxNvP6T-1648630868880)(le 50000.svg+xml)],[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhhB543o-1648630868883)(le n.svg+xml)]
进阶:时间复杂度[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8a1IDeD-1648630868884)(equation.svg+xml)],空间复杂度[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bVJ7BCdC-1648630868884)(equation-16475997509091.svg+xml)]
输入描述:
输入第一行仅包含三个正整数n,x,y,分别表示参赛的人数和晋级淘汰人数区间。(1<=n<=50000,1<=x,y<=n)输入第二行包含n个整数,中间用空格隔开,表示从1号选手到n号选手的成绩。(1<=|a_i|<=1000)
输出描述:
输出仅包含一个整数,如果不存在这样的m,则输出-1,否则输出符合条件的最小的值。
输入例子1:**
6 2 3
1 2 3 4 5 6
输出例子1:
3
code:
lst= list(map(int, input().split()))
n, x, y = lst[0], lst[1], lst[2]
nums = list(map(int, input().split()))
nums.sort()
res = -1
def search(nums, k):
i, j = 0, len(nums)-1
while i <= j:
m = i +((j-i)>>1)
if nums[m] <= k: i = m + 1
else: j = m-1
index = i
return index
mi = min(nums)
ma = max(nums)
for num in range(mi, ma+1):
m = search(nums, num)
if m <= y and m >= x and n - m <= y and n - m >= x:
res = num #注意别写成m
break
print(res)
第2题
我们称一个长度为n的序列为正则序列,当且仅当该序列是一个由1~n组成的排列,即该序列由n个正整数组成,取值在[1,n]范围,且不存在重复的数,同时正则序列不要求排序
有一天小团得到了一个长度为n的任意序列s,他需要在有限次操作内,将这个序列变成一个正则序列,每次操作他可以任选序列中的一个数字,并将该数字加一或者减一。
请问他最少用多少次操作可以把这个序列变成正则序列?
n = int(input())
nums = list(map(int, input().split()))
nums.sort(reverse=True)
res = 0
for num in nums:
res += abs((num - n))
n -= 1
print(res)
第3题
小美和小团所在公司的食堂有N张餐桌,从左到右摆成一排,每张餐桌有2张餐椅供至多2人用餐,公司职员排队进入食堂用餐。小美发现职员用餐的一个规律并告诉小团:当男职员进入食堂时,他会优先选择已经坐有1人的餐桌用餐,只有当每张餐桌要么空着要么坐满2人时,他才会考虑空着的餐桌;
当女职员进入食堂时,她会优先选择未坐人的餐桌用餐,只有当每张餐桌都坐有至少1人时,她才会考虑已经坐有1人的餐桌;
无论男女,当有多张餐桌供职员选择时,他会选择最靠左的餐桌用餐。现在食堂内已有若干人在用餐,另外M个人正排队进入食堂,小团会根据小美告诉他的规律预测排队的每个人分别会坐哪张餐桌。
code:
import heapq
T = int(input())
while T:
T -= 1
N = int(input())
people = input()
M = int(input())
genders = input()
people = [int(x) for x in people]
heap0 = []
heap1 = []
for i, person in enumerate(people, start=1):
if person == 0:
heapq.heappush(heap0, i)
if person == 1:
heapq.heappush(heap1, i)
for gender in genders:
f0 = heap0[0] if heap0 else 0 #空的位置
f1 = heap1[0] if heap1 else 0 #坐了一个人的位置
if gender == 'M':
ans = 'f1' if f1 else 'f0'
else:
ans = 'f0' if f0 else 'f1'
if ans == 'f1':
heapq.heappop(heap1)
print(f1)
else:
heapq.heappush(heap1, heapq.heappop(heap0)) #加进去的始终维持最小堆,pop出的是最左的位置
print(f0)
赛马网 美团输入输出示范
while 1:
x = list(map(int, input().split()))
n, m = x[0],x[1]
res = n
for _ in range(m-1):
n **= 0.5
res += n
print('%.2f'%res)
#赛码网版本#
def main():
s = []
res = []
# input
for _ in range(2):
s.append(input())
# solve
for i in range(2):
if len(s[i]) == 0:
continue
zero = len(s[i])%8
s[i] += '0'*(8-zero) if zero>0 else ""
for j in range(len(s[i])//8):
res.append(s[i][j*8:j*8+8])
# output
for i in range(len(res)):
print(res[i])
while 1:
main()
华为机试练习
MGJ14 字符串的排列
描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母,例如ac
输出描述:
[ac, ca]
示例1
输入:
acc
输出:
[acc, cac, cca]
方法一:回溯
st = input()
def dfs(st, path, res):
if not st:
res.append(path)
return
for i in range(len(st)):
dfs(st[:i] + st[i+1:], path + st[i], res)
path, res = '', [] #往往是细节!path不是[]
dfs(st, path, res)
# res = set(res)
# res = list(sorted(res))
res = list(set(res)) #去重
res.sort() #排序
print('[' + ', '.join(res) + ']')
BD5 字符串匹配
描述
牛牛有两个字符串A和B,其中A串是一个01串,B串中除了可能有0和1,还可能有’?’,B中的’?'可以确定为0或者1。 寻找一个字符串T是否在字符串S中出现的过程,称为字符串匹配。牛牛现在考虑所有可能的字符串B,有多少种可以在字符串A中完成匹配。
例如:A = “00010001”, B = “??”
字符串B可能的字符串是"00",“01”,“10”,“11”,只有"11"没有出现在字符串A中,所以输出3
输入描述:
输入包括两行,第一行一个字符串A,字符串A长度length(1 ≤ length ≤ 50),A中每个字符都是’0’或者’1’。 第二行一个字符串B,字符串B长度length(1 ≤ length ≤ 50),B中的字符包括’0’,‘1’和’?’。
输出描述:
输出一个整数,表示能完成匹配的字符串种数。
示例1
输入:
00010001
??
输出:
3
方法一:遍历,全部保存起来,去重
A = input()
B = input()
lenA = len(A)
lenB = len(B)
res = []
for i in range(lenA-lenB+1):
tmp = 0
for j in range(lenB):
if B[j] == '?' or A[i+j] == B[j]:
tmp += 1
else:
break
if tmp == lenB:
res.append(A[i:i+lenB])
print(len(set(res)))
OR69 字符串组合
描述
输入一个字符串,输出该字符串中相邻字符的所有组合。
举个例子,如果输入abc,它的组合有a、b、c、ab、bc、abc。(注意:输出的组合需要去重)(40分)
输入描述:
一个字符串
输出描述:
一行,每个组合以空格分隔,相同长度的组合需要以字典序排序,且去重。
示例1
输入:
bac
输出:
a b c ac ba bac
方法一:
s1 = input()
L = len(s1)
res = []
for i in range(1,L+1):
tmp = []
for j in range(L-i+1):
tmp.append(s1[j:j+i])
tmp = list(set(tmp))
tmp.sort() #把同长度的作为一个组先排序
res += tmp
print(' '.join(res))
CD130 拼接所有的字符串产生字典序最小的字符串
描述
给定一个字符串的数组strs,请找到一种拼接顺序,使得所有的字符串拼接起来组成的字符串是所有可能性中字典序最小的,并返回这个字符串。
输入描述:
输入包含多行,第一行包含一个整数n( 1 \leq n \leq 10^5 )(1≤n≤105),代表字符串数组strs的长度,后面n行,每行一个字符串,代表strs[i](保证所有字符串长度都小于10)。
输出描述:
输出一行,包含一个字符串,代表返回的字典序最小的字符串。
示例1
输入:
2
abc
de
输出:
abcde
示例2
输入:
2
b
ba
输出:
bab
方法一:cmp_to_key方法
from functools import cmp_to_key
T = int(input())
strs = []
while T:
T -= 1
s = input()
strs.append(s)
def sort_func(x, y): #x、y表示前后两个元素
if x + y < y + x:
return -1 #-2也行,只要标记的比下面这种情况小就可以
elif x + y > y + x:
return 1
else:
return 0
strs.sort(key = cmp_to_key(sort_func) )
print(''.join(strs))
LC 729
实现一个 MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ,则可以存储这个新的日程安排。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。
日程可以用一对整数 start 和 end 表示,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end 。
class MyCalendar:
def __init__(self):
self.lst = []
def book(self, start: int, end: int) -> bool:
for left, right in self.lst:
if end > left and start < right:
return False
self.lst.append((start, end))
return True
华为研发工程师编程题1-汽水瓶
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
数据范围:输入的正整数满足 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VUFzB2l-1648630868885)(le 100.svg+xml)]
注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。
while 1:
n = int(input())
if n == 0: break
res = 5 * (n // 10) + (n%10)//2
print(res)
华为研发工程师编程题2-明明的随机数
明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
T = int(input())
nums = []
for _ in range(T):
nums.append(int(input()))
nums = list(set(nums))
nums.sort()
for num in nums:
print(num)