9.10美团笔试

又是凌晨做笔试的一天,心累+1

4个编程。
1. 两个人分别以1/x和1/y的速度从左往右和从右往左工作,规定做到第k个的时候小丽获胜,判断是否获胜输出Tie/Win/Lose
思路:不要用分数去计算,把分数的分母交换一下方便计算,小丽速度为y,另外一个人速度为x,小丽时间为k*y,另外一个人时间为(n-k+1)*x,比较时间长短即可。
def judge(n, k, x, y):
    s1, s2 = y, x
    t1, t2 = k * s1, (n - k + 1) * s2

    if t1 == t2:
        return "Tie"
    elif t1 < t2:
        return "Win"
    else:
        return "Lose"

t = int(input())
for i in range(t):
    n, x, y, k = map(int, input().split())
    res = judge(n, k, x, y)
    print(res)

2. n长度的数组,一次操作为使一个数+1。问最小操作次数,使得数组和不为0,乘积也不为0。
思路:计算一下数组的和与数组中0的个数,分情况讨论。和不为0且没有0的情况下输出0;和为0且没有0的情况下输出1;和不为0但是有0的情况下输出0的个数;和为0但是也有0的情况下也输出0的个数。
可能分情况讨论最后有点问题,过了82%的case
n = int(input().strip())
arr = list(map(int, input().split()))
suma = 0
cnt_0 = 0
for num in arr:
    suma += num
    if num == 0:
        cnt_0 += 1

if suma != 0 and cnt_0 == 0:
    print(0)
elif suma == 0 and cnt_0 == 0:
    print(1)
elif suma != 0 and cnt_0 != 0:
    print(cnt_0)
else:
    print(cnt_0)



3. 完全二叉树的路径上最大值。长度为1至正无穷的结点,然后有n个宝藏,给出了对应结点位置和宝藏价值多少,每次只能从根节点到子节点,求可以获得的最大价值和。
思路:先用一个数组存储每个位置的宝藏价值,在类似于dp一样遍历,每次判断为奇数或者偶数加上根节点的价值,同时记录最大值。
这个不知道什么问题,也是过了82%的case
n = int(input().strip())
p = list(map(int, input().split()))
w = list(map(int, input().split()))
maxi = max(p)
arr = [0]*(maxi+1)
res = -1
for i in range(n):
    ind = p[i]
    val = w[i]
    arr[ind] += val
for j in range(maxi+1):
    if j % 2 == 0:
        prev = arr[j // 2]
    else:
        prev = arr[(j - 1) // 2]
    arr[j] += prev
    res = max(res, arr[j])
print(res)

4. 给一个长度为n的数组,和一个除数m。每次可以选择数组中的一个数加上10的k次幂再对m取余数,k取0~9。输出数组每个位置的数变成0的最小次数。
思路:首先用一个dic存储了10的所有次幂对m取余数的结果。然后遍历数组,当可以整除的时候对应结果为0,当不能够整除的时候需要计算m-这个数的差可以被dic中的余数加起来的次数。
这里我写了一个find函数去计算次数,但是细节有问题,导致用例没有过。
def find(dic, num):
    res = -1
    values = dic.values()
    for v in values:
        if v == 0:
            continue
        elif v == num:
            return 1
        elif num % v == 0:
            res = max(res,v)
        else:
            continue
    return num//res


n, m = map(int, input().split())
arr = list(map(int, input().split()))
dic = {}
for j in range(10):
    dic[j] = pow(10, j) % m
nums = [0] * n
for i in range(n):
    val = arr[i] % m
    if val == 0:
        nums[i] = 0
    else:
        dif = m - val
        print(dif)
        times = find(dic, dif)
        nums[i] = times
print(" ".join(nums))

选择:HDFS,attention,,数据转换

#美团笔试##美团#
全部评论
第二题不用考虑那么多,就是遍历一遍,0的位置都加一,最后求和,和是零操作次数再加一就行了
2 回复 分享
发布于 2022-09-10 18:24 上海
和不为0但是有0的情况下输出0的个数 这里对 0 0 -1 -1 , 输出不是 0 的个数,因为变为 1 1 -1 -1 后和变为 0了,要再+1
2 回复 分享
发布于 2022-09-10 18:41 北京
最后一题应该是宽搜 但是我最后10分钟才想到 骗了20分就结束了
1 回复 分享
发布于 2022-09-10 20:06 北京
悄悄问一下,怎么看通过率,我咋只有自测啊,是要切换模式吗??
点赞 回复 分享
发布于 2022-09-10 18:18 北京
第三题,应该是超时了,因为最大值是2**30 , 可以通过遍历room下标代替
点赞 回复 分享
发布于 2022-09-10 18:19 新加坡
大佬们,有近几次笔试完约面的吗
点赞 回复 分享
发布于 2022-09-10 18:43 北京
选择题答案有人记得吗
点赞 回复 分享
发布于 2022-09-10 22:21 上海

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
点赞 评论 收藏
分享
5 15 评论
分享
牛客网
牛客企业服务