#每日一练

题目:

现有一份 n + m 次投掷单个 六面 骰子的观测数据,骰子的每个面从 16 编号。观测数据中缺失了 n 份,你手上只拿到剩余 m 次投掷的数据。幸好你有之前计算过的这 n + m 次投掷数据的 平均值

给你一个长度为 m 的整数数组 rolls ,其中 rolls[i] 是第 i 次观测的值。同时给你两个整数 meann

返回一个长度为 n 的数组,包含所有缺失的观测数据,且满足这 n + m 次投掷的 平均值 mean 。如果存在多组符合要求的答案,只需要返回其中任意一组即可。如果不存在答案,返回一个空数组。

k 个数字的 平均值 为这些数字求和后再除以 k

注意 mean 是一个整数,所以 n + m 次投掷的总和需要被 n + m 整除。

思路:

可以将这道题拆解成两个部分,第一部分是解决缺失数值范围的问题,第二部分是取得符合要求的值。第一部分可以先计算出缺失数值的和n_sum,然后划定n_sum的有效范围 (n_sum一定大于等于n并且小于等于6n。例如当n为2时,只有两个缺失数值的和一定大于等于2,小于等于12)

第二部分可以先取n_sum的平均值,再去取对n的余数,如果余数>0,那么就将余数平均加在n_sum的平均值上面。

代码:

class Solution:
    def missingRolls(self, rolls: List[int], mean: int, n: int) -> List[int]:
        n_sum= mean * (len(rolls) + n) - sum(rolls)
        if  n_sum > 6 * n or n_sum < n :
            return []
        n_ave = int(n_sum / n)  
        res = [n_ave] * n   
        mod = n_sum % n
        if mod > 0:
            for i in range(mod):
                res[i] += 1
        return res

心得:

别着急,慢慢想,会有有思路的

原题链接:https://leetcode.cn/problems/find-missing-observations/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值