网易笔试 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: 求各位大佬帮忙内推…快找不到工作了
#笔试题目##笔试题型##网易#