LeetCode每日一题——找出缺失的观测数据

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

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

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

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

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

首先要求的是另一组的总和值,记为 n_sum ,对于骰子来说,只有1-6这六个整数,因此得到的值n_sum有要求: n<=n_sum<=6*n 如果不满足这个条件,那么剩下的骰子组合无法满足n_sum的值;

需要返回的数组 res ,我们可以现初始化所有的值都为1,将待添加的值记为 ready ,然后根据 ready 的值来为每一项的值进行增加,分为两种情况:

  • ready>=5,此时我们只要将对应的骰子点数直接加上5即可,然后ready自减5
  • ready<5,此时我们需要将对应的骰子点数加上ready,然后把ready归0或者直接break跳出循环

代码如下:

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 []
        res = [1 for i in range(n)]
        ready = n_sum - n
        for i in range(n):
            if ready >= 1:
                if ready >= 5:
                    res[i] += 5
                    ready -= 5
                else:
                    res[i] += ready
                    break
     return res

 

posted @ 2022-03-29 10:44  WXjzc  阅读(66)  评论(0编辑  收藏  举报