题目描述

image.png
image.png

看到题目其实很快就能想到思路

(现有数据的长度 + 缺失的长度) 平均值 = 数据的总和 如果 数据的总和 - 现有数据的总和 > 缺失的长度 骰子的最大值6 则代表没有这么多的空间可以容纳,返回空数组就可以了

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

示例代码

  1. public int[] missingRolls(int[] rolls, int mean, int n) {
  2. int rLen = rolls.length;
  3. int sumLen = rLen + n;
  4. int sum = mean * sumLen;
  5. int rSum = 0;
  6. for(int r : rolls){
  7. rSum += r;
  8. }
  9. if((sum-rSum) > 6*n || (sum-rSum) < n){
  10. return new int[0];
  11. }else{
  12. int[] res = new int[n];
  13. int temp = 0;
  14. for(int i=0; i<n; i++){
  15. res[i] = (sum-rSum)/n;
  16. temp += (sum-rSum)/n;
  17. }
  18. int temp2 = (sum-rSum) - temp;
  19. for(int i=0; i<temp2; i++){
  20. res[i] = res[i]+1;
  21. }
  22. return res;
  23. }
  24. }

结合对题目的分析,可以知道
image.png
这部分代码是最影响效率的,上述代码分配的方法是先按照取余进行分配,分配之后剩下的数,在从头开始依次加1,这里也贴出官解的代码

  1. public int[] missingRolls(int[] rolls, int mean, int n) {
  2. int m = rolls.length;
  3. int sum = mean * (n + m);
  4. int missingSum = sum;
  5. for (int roll : rolls) {
  6. missingSum -= roll;
  7. }
  8. if (missingSum < n || missingSum > 6 * n) {
  9. return new int[0];
  10. }
  11. int quotient = missingSum / n, remainder = missingSum % n;
  12. int[] missing = new int[n];
  13. for (int i = 0; i < n; i++) {
  14. missing[i] = quotient + (i < remainder ? 1 : 0);
  15. }
  16. return missing;
  17. }

业务场景

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