网易笔试 8.8 算法岗 ac3道 Python

AC了三道,第四道不会…

第一题

直接统计单词数量就可以了,都转化小写

import collections
if __name__=='__main__':
    n = int(input())
    counter = collections.defaultdict(int)
    for _ in range(n):
        word = input()
        word = word.lower()
        counter[word] += 1
    ret = 0

    for k, v in counter.items():
        if v * 100 >= n:
            ret += 1
    print(ret)

第二题

大意是有n个物品,每个都有各自的价值,然后删去一些,分两个人,让每个人得到物品的价值相等。n最大为15
那么所有删除的情况为 种,直接暴力就好了,枚举所有删除情况,然后看一下剩下的能否均分就可以

def isValid(nums):
    sum_ = sum(nums)
    if sum_ & 1:
        return False
    mid = sum_ // 2
    visited = set()
    visited.add(0)
    for num in nums:
        idxs = list(visited)
        for idx in idxs:
            visited.add(idx + num)
    return mid in visited


def solve(n, nums):
    ret = float('inf')
    # 枚举所有删除情况
    for mask in range(2 ** n):
        select = []
        unselect = 0
        for i in range(n):
            if mask & (1 << i):
                unselect += nums[i]
            else:
                select.append(nums[i])
        # print(select, unselect)
        if ret <= unselect:
            continue
        else:
            if isValid(select):
                ret = unselect
    print(ret)


if __name__ == '__main__':
    t = int(input())
    for _ in range(t):
        n = int(input())
        nums = list(map(int, input().split()))
        solve(n, nums)

第三题

比较基础的DP吧,主要坑在比如了12:30:23这种情况。竟然输出结果是am
我是倒着dp的,代码有点乱将就着看吧…

def solve(n, a, b):
    if n == 1:
        ret = a[0]
    else:
        buy1 = [a[-1], 0]
        buy2 = [float('inf'), 0]
        for j in range(n - 2, -1, -1):
            cur1 = a[j] + min(buy1[0], buy2[0])
            cur2 = b[j] + min(buy1[1], buy2[1])
            buy1[1] = buy1[0]
            buy1[0] = cur1
            buy2[1] = buy2[0]
            buy2[0] = cur2
        ret = min(buy1[0], buy2[0])
    isam = True
    hour = ret // 3600
    tt = 8 + hour
    while tt >= 13:
        tt -= 12
        isam = not isam
    ret -= hour * 3600
    minute = ret // 60
    ret -= minute * 60
    second = ret
    suffix = 'am' if isam else 'pm'
    print("{:02d}:{:02d}:{:02d} {}".format(tt, minute, second, suffix))


if __name__ == '__main__':
    t = int(input())
    for _ in range(t):
        n = int(input())
        a = list(map(int, input().split()))
        b = list(map(int, input().split()))
        solve(n, a, b)

Ps: 求各位大佬帮忙内推…快找不到工作了

#笔试题目##笔试题型##网易#
全部评论
12点是am,原来我65%是错在这😂
点赞 回复 分享
发布于 2020-08-08 16:56
大佬,请问一下dp问题一般是怎么想到用dp解的,我一般LeetCode上知道题型是dp才会用dp的方法做,如果不知道题型就经常想不出来
点赞 回复 分享
发布于 2020-08-08 17:07
都是算法岗,为啥我们题并非完全一样
点赞 回复 分享
发布于 2020-08-08 17:48
大佬   还有一题是啥    我还没看就结束了.....
点赞 回复 分享
发布于 2020-08-08 18:06
😀大佬列害!
点赞 回复 分享
发布于 2020-08-10 20:53
输在了常识问题上 哭了
点赞 回复 分享
发布于 2020-08-13 19:51

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
评论
5
17
分享
牛客网
牛客企业服务