题源思路代码
pythonjavaCJavascript
题源2028. 找出缺失的观测数据 思路
刚开始我用了错误的思路(是错误的哦,看看就可以了):先算出剩余数的平均值,然后再在平均值里面把小数取出来,算剩余的和(用剩余的小数乘以缺失的n份),然后就可以得到平均多少个里面有一个多一。我说的不太清楚,也没有关系,反正这是一种错误思想。因为少考虑无限穷小数。正确的思想:
- 算出缺失的n份中,剩余的总数nSum;当nSum大于最大点数6和n的相乘或者nSum小于最小点数1和n的相乘的时候,返回空数组;(为什么这样呢?因为最好的情况就是n份都是6,然后你都大于了,然后就说明其中有一份点数为7,故不成立,最坏情况同理。);算出在n份中平均的点数nMeanInt,和分完n份的剩余点数rest;然后输出的前面rest个元素的值为nMeanInt + 1,rest个元素之后的值为nMeanInt的数组。
class Solution:
def missingRolls(self, rolls: List[int], mean: int, n: int) -> List[int]:
nSum = (len(rolls) + n) * mean - sum(rolls)
if nSum > 6 * n or nSum < n:
return []
rest = nSum % n
nMean = int(nSum/n)
return [nMean for _ in range(n - rest)] + [nMean + 1 for _ in range(rest)]
java执行用时:112 ms, 在所有 Python3 提交中击败了65.43%的用户
内存消耗:19.6 MB, 在所有 Python3 提交中击败了24.69%的用户
class Solution {
public int[] missingRolls(int[] rolls, int mean, int n) {
int nSum = (rolls.length + n) * mean - Arrays.stream(rolls).sum();
if(nSum > 6 * n || nSum < n) return new int[0];
int rest = nSum % n, nMeanInt = nSum / n;
int[] arr = new int[n];
Arrays.fill(arr, 0, rest, nMeanInt + 1);
Arrays.fill(arr, rest, n, nMeanInt);
return arr;
}
}
C执行用时:14 ms, 在所有 Java 提交中击败了6.31%的用户
内存消耗:56.7 MB, 在所有 Java 提交中击败了45.05%的用户
int sum(int *arr, int arrSize){
int sum = 0;
for(int i = 0; i < arrSize; i++) sum += arr[i];
return sum;
}
int *createIntArr(int len, int value, int *returnSize){
*returnSize = len;
int* result = (int *)malloc(sizeof(int) * len);
for(int i = 0; i < len; i++) result[i] = value;
return result;
}
int* missingRolls(int* rolls, int rollsSize, int mean, int n, int* returnSize){
int nSum = (rollsSize + n) * mean - sum(rolls, rollsSize);
if( nSum > 6 * n || nSum < n){
int *nullArr = createIntArr(0, 0, returnSize);
return nullArr;
}
int rest = nSum % n, nMeanInt = nSum / n;
int *result = createIntArr(n, nMeanInt, returnSize);
for(int i = 0; i < rest; i++) result[i] += 1;
return result;
}
Javascript执行用时:732 ms, 在所有 C 提交中击败了68.18%的用户
内存消耗:86.2 MB, 在所有 C 提交中击败了83.36%的用户
const sum = (arr) => {
let sum1 = 0
for(let num of arr){
sum1 += num
}
return sum1
}
var missingRolls = function(rolls, mean, n) {
const nSum = (rolls.length + n) * mean - sum(rolls)
if(nSum > 6 * n || nSum < n) return []
const [rest, nMeanInt] = [nSum % n, Math.floor(nSum / n)]
let result = new Array(n).fill(nMeanInt)
result.fill(nMeanInt + 1, 0, rest)
return result
};
执行用时:276 ms, 在所有 Javascript 提交中击败了88.89%的用户
内存消耗:59.6 MB, 在所有 Javascript 提交中击败了88.89%的用户



