题目描述

看到题目其实很快就能想到思路
(现有数据的长度 + 缺失的长度) * 平均值 = 数据的总和
如果 数据的总和 - 现有数据的总和 > 缺失的长度 * 骰子的最大值6 则代表没有这么多的空间可以容纳,返回空数组就可以了

最大的问题在于当 数据的总和 - 现有数据的总和 < 缺失的长度 * 骰子的最大值6 时,这个时候会出现一种情况
比如 数据的总和 - 现有数据的总和 = 19, 缺失的长度为5, 那么很容易就能得到这是有解的,能想到返回解是[3,4,4,4,4]是最方便的,但是19/5=3,如何变成4就是最影响效率的事情

示例代码

public int[] missingRolls(int[] rolls, int mean, int n) {
        int rLen = rolls.length;
        int sumLen = rLen + n;
        int sum = mean * sumLen;

        int rSum = 0;
        for(int r : rolls){
            rSum += r;
        }

        if((sum-rSum) > 6*n || (sum-rSum) < n){
            return new int[0];
        }else{
            int[] res = new int[n];
            int temp = 0;
            for(int i=0; i<n; i++){
                res[i] = (sum-rSum)/n;
                temp += (sum-rSum)/n;
            }
            int temp2 = (sum-rSum) - temp;
            for(int i=0; i<temp2; i++){
                res[i] = res[i]+1;
            }

            return res;
        }
    }

结合对题目的分析,可以知道

这部分代码是最影响效率的,上述代码分配的方法是先按照取余进行分配,分配之后剩下的数,在从头开始依次加1,这里也贴出官解的代码

public int[] missingRolls(int[] rolls, int mean, int n) {
    int m = rolls.length;
    int sum = mean * (n + m);
    int missingSum = sum;
    for (int roll : rolls) {
        missingSum -= roll;
    }
    if (missingSum < n || missingSum > 6 * n) {
        return new int[0];
    }
    int quotient = missingSum / n, remainder = missingSum % n;
    int[] missing = new int[n];
    for (int i = 0; i < n; i++) {
        missing[i] = quotient + (i < remainder ? 1 : 0);
    }
    return missing;
}

业务场景

分配的过程,也是kafka 分区分配策略里的 range