leetcode刷题记录-2028. 找出缺失的观测数据

145 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

今天的题目为中等,简单的构造题目,仔细阅读题目要求以及结合示例就会发现其实是很简单的数学问题,然后按照题目的要求去模拟就好了。

每日一题

今天的题目是 2028. 找出缺失的观测数据,难度为中等

  • 现有一份 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 整除。

 

示例 1:

输入:rolls = [3,2,4,3], mean = 4, n = 2
输出:[6,6]
解释:所有 n + m 次投掷的平均值是 (3 + 2 + 4 + 3 + 6 + 6) / 6 = 4

示例 2:

输入:rolls = [1,5,6], mean = 3, n = 4
输出:[2,3,2,2]
解释:所有 n + m 次投掷的平均值是 (1 + 5 + 6 + 2 + 3 + 2 + 2) / 7 = 3

示例 3:

输入:rolls = [1,2,3,4], mean = 6, n = 4
输出:[]
解释:无论丢失的 4 次数据是什么,平均值都不可能是 6

示例 4:

输入:rolls = [1], mean = 3, n = 1
输出:[5]
解释:所有 n + m 次投掷的平均值是 (1 + 5) / 2 = 3

 

提示:

  • m == rolls.length
  • 1 <= n, m <= 105
  • 1 <= rolls[i], mean <= 6

题解

简单构造

不要看这道题题目好像很长要求很多,但是其实基本上需要的值都给了,总结一下有的数据以及需要求的数据,就会发现其实就只是简单的数学题。

  1. 首先题目给了我们 m 次的数组,那么我们就可以计算出这 m 次所得到的数的总和,我们称为 mSum

  2. 然后给了我们平均值,那么就可以求的,总共的 m+n 次得到的数的总和是 mean*(m+n)

  3. 然后我们从总的值里面减去 mSum ,剩下的就是 n 次所得数的和,我们称它为 nSum,因为我们是用骰子来计数,所以 n 次所得的数据是由范围的:1*n < nSum < 6*n,

  4. 如果 nSum 不满足这个条件,那么就是答案不存在,返回空数组。

  5. 满足的话,我们可以通过数学计算去求得每一个骰子的值应该是多少,因为题目只要求返回一个结果,并没有做要求,那么答案的计算方式就很多了,只要最后满足 n 的数组的值相加为 nSum 即可。

这里我使用的方法是:先将 n 的数组初始化出来,并且每个都填入 1 ,那么对应的 nSum 就要减去 n,然后循环判断当前的 nSum 是不是小于 0,不是的话将 5 或者 nSum 两个小一点的那个赋值给 n 数组中的一项,并且 nSUm 减去 5,然后循环下一项重复上面步骤,一直到 nSum 小于 0 则退出循环。

/**
 * @param {number[]} rolls
 * @param {number} mean
 * @param {number} n
 * @return {number[]}
 */
 var missingRolls = function(rolls, mean, n) {
    const m = rolls.length;
    const sum = mean * (n + m);
    let mSum = rolls.reduce((a, b) => a + b)
    let nSum = sum - mSum;
    if (nSum < n || nSum > 6 * n) {
        return [];
    }
    nSum = nSum -n
    const ans = new Array(n).fill(1)
    for (let i = 0; i < ans.length; i ++) {
        if (nSum < 0) {
            break
        }
        ans[i] += Math.min(5, nSum)
        nSum -= 5
    }
    return ans;
};

image.png