>2028. 找出缺失的观测数据<
>missingRolls<
一、解题思路
1、解法一( Java )
解法思路:模拟一
求出 n
份数据的平均值 avg
(存在精度损失),当平均值小于 1
或者大于 6
时直接返回空数组 return new int[0]
,然后Arrays.fill(ans, avg)
将指定的 int
值分配给指定 int 型数组
的 每个元素
,再 ans[i]++
将剩余的数据(精度损失的数据)
分摊,当某次观测数据大于 6
时直接返回空数组即可。
Arrays.fill(int[] a, int val)
方法
fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组的每个元素。
伪代码如下:
/**
* @author Listen 1024
* @description 2028. 找出缺失的观测数据
* @date 2022-03-27 10:21
*/
class Solution {
public int[] missingRolls(int[] rolls, int mean, int n) {
int[] ans = new int[n];//用于返回的整型数组
int sum = mean * (n + rolls.length);//所有(m + n)份数据的总和
int res = sum - sum(rolls);//n 份数据的总和
int avg = res / n;//n 份数据的平均值(存在精度损失)
if (avg < 1 || avg > 6) {
return new int[0];//平均值小于 1 或者大于 6 时直接返回空数组
}
Arrays.fill(ans, avg);//将指定的 int 值分配给指定 int 型数组的每个元素。
for (int i = 0; i < res - avg * n; i++) {
ans[i]++;//将剩余的数据分摊
if (ans[i] > 6) {
return new int[0];//某次观测数据大于 6 时直接返回空数组
}
}
return ans;
}
//计算已知 m 次数据的总和
private int sum(int[] rolls) {
int ans = 0;
for (int a : rolls) {
ans += a;
}
return ans;
}
}
1、解法二( Java )
解法思路:模拟二
求出 n
份数据的平均值 avg
(存在精度损失),当 missingSum
满足 n ≤ missingSum ≤ 6×n
时,一定存在一种符合要求的答案,不满足时直接返回空数组 return new int[0];
,然后再 ans[i] += avg + (i < remainder ? 1 : 0)
将数据分摊即可。
伪代码如下:
/**
* @author Listen 1024
* @description 2028. 找出缺失的观测数据
* @date 2022-03-27 10:21
*/
class Solution9 {
public int[] missingRolls(int[] rolls, int mean, int n) {
int[] ans = new int[n];
int sum = mean * (n + rolls.length);
int missSum = sum;
for (int a : rolls) {
missSum -= a;
}
if (missSum < n || missSum > 6 * n) {
//当missingSum 满足 n ≤ missingSum ≤ 6×n 时,一定存在一种符合要求的答案
return new int[0];
}
int avg = missSum / n;
int remainder = missSum % n;//取余数
//Arrays.fill(ans, avg);
for (int i = 0; i < n; i++) {
ans[i] += avg + (i < remainder ? 1 : 0);
}
return ans;
}
}
运行结果截图如下: