1. 程式人生 > 其它 >LeetCode每日一題——找出缺失的觀測資料

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