题目描述


看到题目其实很快就能想到思路
(现有数据的长度 + 缺失的长度) 平均值 = 数据的总和 如果 数据的总和 - 现有数据的总和 > 缺失的长度 骰子的最大值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
