Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
【刷题日记】2028. 找出缺失的观测数据
本次刷题日记的第 12 篇,力扣题为:2028. 找出缺失的观测数据赛 ,中等
一、题目描述:
稍微看完题目,第一反应,这是一个数学题,实际仔细看完之后,这确实又是一个数学题,只是需要我们用编程的方式来实现而已 , 那我们一起来分析一下
二、思路分析:
1、这道题考察了什么思想?你的思路是什么?
按照题目中给出的信息,我们可以知道有这些重要的点:
- 给出的 rolls 数组中的元素和我们需要补充的元素数据范围都是 1 – 6
- 现在我们是知道平均值 mean,知道 n+m 的数量,来计算丢失的数据,也可以是找到整个观测数据
- 找出 n 对应的数组,可能会有很多个版本,我们只需要输出一个版本就可以了
我们可以按照示例来推理一下:
示例:rolls = [1,5,6], mean = 3, n = 4
根据上述的模拟,我们知道,核心点就是计算能给到 n 个数字的总和 remainSum ,如果 remainSum 小于 n 或者 remainSum 大于 6*n ,则是不满足我们题意的
当得到符合要求的 remainSum 时,我们就可以来分配 n 个数字对应的值了,分配的逻辑也是很简单的
当得到符合要求的 remainSum 时 , remainSum /n 一定是 小于等于 6 的,且如果是等于的情况,一定是没有余数的
则,我们的分配原则就是,将 remainSum % n 得到的余数,分成多分追加到每一个平均数上即可
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码,就按照咱们数学的方式来处理即可
编码如下:
func missingRolls(rolls []int, mean int, n int) []int {
remainSum := mean * (len(rolls) + n )
for _,num := range rolls {
remainSum = remainSum - num
}
// 如果剩余的数据不在 n - 6*n 之间,那么就是找不到缺失的数据
if remainSum < n || remainSum > 6 * n {
return nil
}
// 开始构造数据,此处的 remainSum 一定在 n - 6*n 之间 , 则 remainSum / n 一定是 shang 小于 6 ,再加上 yushu
// 则我们可以构造这么一个版本:yushu 个 shang+1 , 和 (n-yushu)个 shang 即可
shang,yushu := remainSum/n , remainSum %n
res := make([]int, n)
for i:=0;i<n;i++{
res[i] = shang
if i < yushu{
res[i]++
}
}
return res
}
复制代码
实际编码也确实是对于上面思想的翻译,翻译出来的代码如上,主要是要考虑好 n 中能承载的数据范围,以及如何去分配 n 个数据的值
四、总结:
不难理解,此处我们的循环是 n+m ,因此时间复杂度是 O(n+m) , 空间复杂度是 O(1)
原题地址:2028. 找出缺失的观测数据
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~