题目:
现有一份 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,然后划定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/