拼多多暑期实习笔试题(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))




#拼多多笔试##拼多多##笔试题目##实习#
全部评论
第四题里,好像颜色是用整数来表示的,然后取值的范围是很大的,这样的话,你开一个dict来存储所有整数的出现位置,这样真的放得下吗?
点赞 回复 分享
发布于 2020-04-11 01:34
我想问tmp=helper(distance,k)+1  这里为什么要+1呢? helper得到的不已经是最长长度了吗
点赞 回复 分享
发布于 2020-04-11 04:21
第三题贪心 第四题尺取
点赞 回复 分享
发布于 2020-04-11 10:01

相关推荐

评论
5
21
分享
牛客网
牛客企业服务