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