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后两个不确定。 大家有想法也可以留言一起讨论!!
加油