拼多多暑期实习笔试题(4.10),AC3题
第一题 买三赠一,最便宜的可以免费
AC代码
n=int(input()) nums=list(map(int,input().strip().split())) def solution(nums): nums=sorted(nums)[::-1] n=len(nums)//3 res=0 for i in range(len(nums)): if (i+1)%3!=0: res+=nums[i] return res print(solution(nums))第二题 可以整除M的连续子数组个数
AC代码
def solution(nums,M): record={0:1}#表示前缀合除以M后的余数为0的有1个 res=0 presum=0 for i in range(len(nums)): presum+=nums[i] #presum 表示i项和,presum减去之前的presum可得某一个连续子数组和 residual=presum%M res+=record.get(residual,0) if record.get(residual,0)==0: record[residual]=1 else: record[residual]+=1 return res N,M=list(map(int,input().strip().split())) nums=list(map(int,input().strip().split())) print(solution(nums,M))第三题不会,求赐教。
第四题 最多移除K个字符后的最长连续相同字符长度
AC代码
from collections import defaultdict def solution(nums,k): res=0 visited=defaultdict(list) for i in range(len(nums)): visited[nums[i]].append(i) #用字典记录每个字符出现在哪些索引 for value in visited.values(): distance=[value[i]-value[i-1]-1 for i in range(1,len(value))] #计算将索引i和索引j连在一起需要移除的字符数 tmp=helper(distance,k)+1 res=max(res,tmp) return res def helper(distance,k): #通过滑动窗口法计算最多移除k个的情况下可以连在一起的长度 res=0 l=0 total=0 for i in range(len(distance)): total+=distance[i] while total>k: total-=distance[l] l+=1 res=max(res,i-l+1) return res n,k=list(map(int,input().strip().split())) nums=list(map(int,input().strip().split())) print(solution(nums,k))