8.6美团笔试 后端,算法,数据 python实现 附思路

第一题:
题目描述,有A B两种糖若干颗,现在需要将其放在礼盒里面保证每个礼盒里面都有A B 两颗糖,另外每盒糖必须有3个,一共能装几盒糖。
# 美团第一题
from typing import List

# 首先处理多行输入
nom_row: int = int(input())
inputs_list: List[List] = []
for i in range(nom_row):
    one_row_list = list(map(int, input().split()))
    inputs_list.append(one_row_list)
# 得到多行输入的list列表
for i in inputs_list:
    a_nums = i[0]
    b_nums = i[1]
    x = min(a_nums, b_nums)
    y = max(a_nums, b_nums)
    if y >= x * 2:
        print(x)
    else:
        temp = x - int((x * 2 - y) / 3)
        if (x * 2 + y) / 3 < temp:
            print(temp - 1)
        else:
            print(temp)s
思路:每个盒子里面须有A B两个糖,一共需要三个糖,假如A 多B少,B是A的二倍的话,那么就是A盒子糖,假如B不到A的二倍,那就先设盒数在A的基础上减少k,把减去的看成B,
则达到 2(A-K)=B+K
然后使的A减去K就行了,就是能装的盒数。

第二题:异常点检查,K的左边小于0的是正常点,0是异常点,右边一样。找到最合适的K的位置,异常点最少
nums = int(input())
input_list = list(map(int, input().split()))
cur_error = 0
# 分割处k看成当前元素下边之后的位置  初试状态为第一个元素之前
for i in input_list:
    if i <= 0:
        cur_error += 1
min_error = cur_error
for i in range(len(input_list)):
    if input_list[i] == 1:
        cur_error += 1
    elif input_list[i] == -1:
        cur_error -= 1
    if min_error > cur_error:
        min_error = cur_error
print(min_error)
假设k在最开始  看一共有几个异常点  然后k一直往右移动  每移动一个  看当前值是多少   如果是1  那就异常值比原来多一个   如果是0 这个值不管在左边还是右边都是异常的  如果是-1  整体异常值就会减少1  用一个变量记录最小异常值的情况

第三题:翻转魔法石头。正面一样的石头达到总数一般就可以触发魔法阵。石头有正反,最少翻转几个魔法石。
num = int(input())
lis_up = list(map(int, input().split()))
lis_down = list(map(int, input().split()))
dict_up = {}
dic_sum = {}
for i in range(len(lis_up)):
    if lis_up[i] != lis_down[i]:
        if lis_up[i] not in dic_sum:
            dic_sum[lis_up[i]] = 1
        else:
            dic_sum[lis_up[i]] += 1
        if lis_down[i] not in dic_sum:
            dic_sum[lis_down[i]] = 1
        else:
            dic_sum[lis_down[i]] += 1
    else:
        if lis_up[i] not in dic_sum:
            dic_sum[lis_up[i]] = 1
        else:
            dic_sum[lis_up[i]] += 1
    if lis_up[i] in dict_up:
        dict_up[lis_up[i]] += 1
    else:
        dict_up[lis_up[i]] = 1
min_ref = 10 ** 9
num = 5
half = int((num + 1) / 2)
for i in dict_up:
    # 判断当前情况是否就够一半
    if dict_up[i] >= half:
        min_ref = 0
    else:
        # 判断需要反转的是否大于一共的面
        if ((half - dic_sum[i]) <= 0) and ((half - dict_up[i]) > 0):
            # 小于0证明能够通过反转得到结果
            if half - dict_up[i] < min_ref:
                # 判断当前反转的次数是否为最小次数
                min_ref = half - dict_up[i]
if min_ref == 10 ** 9:
    min_ref = -1
print(int(min_ref))
先判断石头的正反都是一个数字的魔法石的个数,注:一个石头上正反面一样的只算一个,因为无论怎么翻转都是一样的。
用一半的个数减去当前正面朝上的个数,就是需要翻转的个数,小于0的话就是不能达到要求。

第四题:分训练集测试集。
假设类别一共是m个,则将编号m/2(向上取整)个样本作为训练集,其他为测试集
import math
n, k = map(int, input().split())
l = list(map(int, input().split()))

res = dict()
kind = []

for i in range(n):
    if l[i] not in res:
        kind.append(l[i])
        res[l[i]] = []         
    res[l[i]].append(i)
    
train, validate = [],[]
for item in kind:
    divide = math.ceil(len(res[item])/2)
    for num in res[item][:divide]:
        train.append(num)
    for num in res[item][divide:]:
        validate.append(num)

for num in train:
    print(num, end=' ')
print()
for num in validate:
    print(num, end =' ')  
就写这四题吧,前两个题能全A后两个不确定。    大家有想法也可以留言一起讨论!!
加油




#美团笔试##美团##美团校招#
全部评论
第五题有题解吗
点赞 回复 分享
发布于 2022-08-07 23:37
请问您是什么岗
点赞 回复 分享
发布于 2022-08-18 12:56 浙江

相关推荐

点赞 评论 收藏
分享
3 12 评论
分享
牛客网
牛客企业服务